【问题标题】:InvokeMember on generic class results in an exception泛型类上的 InvokeMember 会导致异常
【发布时间】:2015-07-02 13:55:37
【问题描述】:

我有以下课程

public class RowDef
{
    string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public RowDef()
    {

    }
    public RowDef(string name)
        : this()
    {
        Name = name;
    }
}

public class RowDef<T> : RowDef
{

    public RowDef()
    {
    }

    public RowDef(string name)
        : base(name)
    {

    }

    T _value;
    public T Value
    {
        get { return _value; }
        set { _value = value;}
    }
}

我正在尝试使用反射来获取像这样的“Value”属性的值

List<RowDef> rows = new List<RowDef>() { new RowDef<int>() { Value = 5 }, new RowDef<float>() { Value = 5.0f }, new RowDef<string>() { Value = "XXXX" } };
foreach (var row in rows)
{
  var v = typeof(RowDef<>).InvokeMember("Value", BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic |
                            BindingFlags.Instance | BindingFlags.GetProperty, null, child, null);
}

但我得到以下异常

“System.InvalidOperationException”类型的第一次机会异常 发生在 mscorlib.dll 中附加信息:后期绑定操作 不能在类型或方法上执行 ContainsGenericParameters 为真。

我可以做些什么来解决这个问题?

【问题讨论】:

    标签: c# generics reflection invokemember


    【解决方案1】:

    正如错误试图告诉你的那样,直接使用RowDef&lt;&gt; 是没有意义的。 RowDef&lt;&gt; 不是真正的类型;它是一个类型构造函数,可用于制作具体类型,如RowDef&lt;string&gt;

    在您的特定示例中,您实际上只需要row.GetType(),它将返回该实例的具体RowDef&lt;T&gt; 类型。

    或者,更好的是,根本不使用反射,而是将abstract object UntypedValue 属性添加到基类并使用它。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2010-10-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多