我有一个List<T>
变量,其中T在编译时是未知的。我需要像{/ p>这样访问value
类型的T
属性
foreach(var item in items) // items is List<T>
{
item.value // this won't compile because T is unknown
}
我知道在我的情况下<T>
将拥有value
属性。我该如何访问它?
答案 0 :(得分:10)
如果您知道每个T都有 VALUE ,您可以使用dynamic
代替var
foreach(dynamic item in items) //items is List<T>
{
item.VALUE
}
答案 1 :(得分:3)
正如已经回答的那样,正确的方法是创建一个实现Value prop的接口。
但是你已经评论说你无法控制你需要以另一种方式做的课程。
一种方式是反思,我假设您的属性名称为VALUE,(区分大小写)
PropertyInfo pi = typeof(T).GetProperty("VALUE");
object value = pi == null ? null pi.GetValue(item,null);
您可以将反射调用缓存到静态泛型类中,该类在第一次使用时创建静态字段。
或者,您可以使用带有字段和辅助方法的静态通用助手类。
public static class ValueHelper<T> {
public static Func<T,object> ValueFunction;
public static object GetValue(T item) {
var function = ValueFunction;
return function == null ? null : function(item);
}
}
}
然后在代码中的某个地方,你知道T,例如你想设置MyClass
ValueHelper<MyClass>.ValueFunction = x => x.Value;
然后您的列表代码变为
foreach(var item in items)
{
value = ValueHelper<T>.GetValue(item);
}
答案 2 :(得分:1)
如果您可以控制T类,则可以引入具有Value属性的接口,并使每个T类实现此接口。在这种情况下,您可以枚举列表值,如下所示:
foreach(IMyInterface item in items)
{
var someVar = item.VALUE;
//you know that item does have VALUE property and the type of that property as declared in interface
}
UPD。即使您的T类具有不同的属性,它仍然有效:
interface IMyInterface
{
string VALUE{get;set;}
}
class A : IMyInterface
{
public int Aprop{get;set;}
public string VALUE{get;set;}
}
class B : IMyInterface
{
public int Bprop{get;set;}
public string VALUE{get;set;}
}
答案 3 :(得分:0)
如果预先知道T类型,那么你可以这样做(不是最好的方法,但已经在其他答案中解释过了):
foreach(var item in List<T>)
{
if (item.GetType().Equals(typeof(fooClassA)))
{
ret = (item as fooClassA).VALUE_A;
}
if (item.GetType().Equals(typeof(fooClassB)))
{
ret = (item as fooClassB).VALUE_B;
}
....
}