如何在 C# 中循环遍历泛型 class 的属性?
How do I loop through the properties of a generic class in c#?
我正在开发一个 Web 应用程序,它可以在用户屏幕上打印各种计算机部件,用户可以选择合适的价格和 link。我使用 MongoDB 来存储数据,我使用通用 class 来动态选择适当的 class (每个实现 IProduct 并具有独特的属性)。
考虑这个方法:
public HtmlString DatabaseResult<T>(string collectionName)
where T : IProduct
{
var collection = db.GetCollection<T>(collectionName);
var buildString = "";
var query =
from Product in collection.AsQueryable<T>()
where Product.Prijs == 36.49
orderby Product.Prijs
select Product;
PropertyInfo[] properties = typeof(T).GetProperties();
foreach (T item in query){
buildString = buildString + "<p>";
foreach (PropertyInfo property in properties)
{
buildString = buildString + " " + item.property; //Error Here
}
buildString = buildString + "</p>";
}
HtmlString result = new HtmlString(buildString);
return result;
}
我试图循环遍历实现 IProduct 的 class 的属性。这样做的每个 class 都有 4 个共同属性和 3 个不同属性。这就是为什么我需要以编程方式循环遍历属性。我意识到使用反射在实际 class 上使用属性是行不通的。这是我的错误(错误发生在我在上述方法中注释的地方)
'T' does not contain a definition for 'property' and no extension method 'property' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)
结果应该是这样的:
"<p>"
+(value of Motherboard.Price) (value of Motherboard.Productname)
(value of Motherboard.Productlink) value of Motherboard.YetAnotherAttribute).... etc+
"</p>"
我想要的方法是否可行?我正在寻找解决我的问题的方法,甚至可能在必要时重新设计我的代码。预先感谢您的回答。
改变
buildString = buildString + " " + item.property;
至
buildString = buildString + " " + property.GetValue(item, null).ToString();
//or
buildString = String.Format("{0} {1}", buildString, property.GetValue(item, null));
PropertyInfo.GetValue
从 .NET 4.5 开始不需要第二个参数,我相信
我正在开发一个 Web 应用程序,它可以在用户屏幕上打印各种计算机部件,用户可以选择合适的价格和 link。我使用 MongoDB 来存储数据,我使用通用 class 来动态选择适当的 class (每个实现 IProduct 并具有独特的属性)。
考虑这个方法:
public HtmlString DatabaseResult<T>(string collectionName)
where T : IProduct
{
var collection = db.GetCollection<T>(collectionName);
var buildString = "";
var query =
from Product in collection.AsQueryable<T>()
where Product.Prijs == 36.49
orderby Product.Prijs
select Product;
PropertyInfo[] properties = typeof(T).GetProperties();
foreach (T item in query){
buildString = buildString + "<p>";
foreach (PropertyInfo property in properties)
{
buildString = buildString + " " + item.property; //Error Here
}
buildString = buildString + "</p>";
}
HtmlString result = new HtmlString(buildString);
return result;
}
我试图循环遍历实现 IProduct 的 class 的属性。这样做的每个 class 都有 4 个共同属性和 3 个不同属性。这就是为什么我需要以编程方式循环遍历属性。我意识到使用反射在实际 class 上使用属性是行不通的。这是我的错误(错误发生在我在上述方法中注释的地方)
'T' does not contain a definition for 'property' and no extension method 'property' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)
结果应该是这样的:
"<p>"
+(value of Motherboard.Price) (value of Motherboard.Productname)
(value of Motherboard.Productlink) value of Motherboard.YetAnotherAttribute).... etc+
"</p>"
我想要的方法是否可行?我正在寻找解决我的问题的方法,甚至可能在必要时重新设计我的代码。预先感谢您的回答。
改变
buildString = buildString + " " + item.property;
至
buildString = buildString + " " + property.GetValue(item, null).ToString();
//or
buildString = String.Format("{0} {1}", buildString, property.GetValue(item, null));
PropertyInfo.GetValue
从 .NET 4.5 开始不需要第二个参数,我相信