c#反映通用模板类

时间:2010-08-23 17:51:54

标签: c# generics reflection

我的代码示例:

public abstract class<T>
{
   public List<T> GetSomething(string q)
   {
      **List<T> list = new List<T>();**

      Type type = typeof(T);
      PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);

      foreach (PropertyInfo info in props)
      {
          // at this point I need to return information from a data source query
          // and build the members (set values) according to the returning results
          // which needs to be added to a list that contains T with each property
          // within set to a value. "Some Value" should be an object instance required
          // by the Type of the PropertyInfo.

          info.SetValue(type, "Some Value", null);
          **list.Add(type);**
      }
   }

   **return list;**
}
由于模板类型,

info.SetValue(object,object,object [])无法访问,对吗?我的问题是,如何在属性中设置一个值,包含在T?

编辑:这个问题甚至让我感到困惑。我修改了上面的程序来代表我的直接需求。

谢谢, 埃里克

2 个答案:

答案 0 :(得分:2)

我看不出这有什么意义。您正尝试在T的实例上设置属性(如绑定标志所示),但是您要将typeof(T) - 类型 - 传递给{ {1}}作为第一个参数。也许你的意思是:

PropertyInfo.SetValue

在这种情况下,我们将一个T实例传递给GetSomethingFrom方法,然后将实例传递给SetValue。遵循?

-Oisin

答案 1 :(得分:0)

断言您设置的属性实际上也是字符串或者调用SetValue(实例,“Some Value”,null)将会抛出。

可能是个好主意。

您似乎正在尝试创建通用对象初始值设定项。反射将起作用,但我建议调查System.Linq.Expressions命名空间。您可以使用反射来构建一个LambdaExpression,您可以将其动态编译为一个方法,该方法的性能比每次使用反射初始化对象要好得多。