使用后期绑定获取List <t>值</t>

时间:2014-06-09 09:07:32

标签: c# .net list

我有一个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属性。我该如何访问它?

4 个答案:

答案 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;
  }
  ....
}
相关问题