如何在C#中的通用方法中访问属性值?

时间:2019-03-14 12:16:35

标签: c# generics

想象一下,我有几个具有相同属性的不同类型的类。

我想制作一个通用方法,该方法应访问那些类的属性的值。

以下代码无效,将引发此错误:

  

无法解析方法'GetValue(T)'(...)

..那么正确的方法是什么?

public static List<int> FooBar<T>(T myObject)
{
  var myValue = typeof(T).GetProperty("myList").GetValue(myObject);

  return myValue;
}

3 个答案:

答案 0 :(得分:3)

执行此操作的“正确”方法可能是拥有一个where T : SomeInterfaceOrBaseType,即拥有一个myList成员的东西,然后才可以访问它;即return myObject.myList;

interface IFoo {
    List<int> myList {get;}
}
public static List<int> FooBar<T>(T myObject) where T : IFoo {
    return myObject.myList;
}

但是...到您完成此操作时,实际上就不再需要该方法了,就好像调用方知道类型为IFoo一样,他们可以自己完成。 / p>

如果您必须通过反射进行操作...那么,那很难。仅仅滥用dynamic可能会更容易:

public static List<int> FooBar<T>(T myObject)
{
    dynamic obj = myObject;
    List<int> myList = obj.myList;
    return myList;
}

答案 1 :(得分:1)

如果您真的想使用泛型,请尝试以下代码

 return (List<int>)(typeof(T).GetProperty("myList").GetValue(myObject, null))

答案 2 :(得分:1)

您可以这样myObject.GetType().GetProperty("myList").GetValue(myObject, null);