簡體   English   中英

泛型類上的InvokeMember導致異常

[英]InvokeMember on generic class results in an exception

我有以下課程

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);
}

但我得到以下異常

mscorlib.dll中發生了類型'System.InvalidOperationException'的第一次機會異常。其他信息:無法對包含ContainsGenericParameters為true的類型或方法執行后期綁定操作。

我該怎么解決該問題?

由於該錯誤正試圖告訴您,因此直接使用RowDef<>沒有任何意義。 RowDef<>並不是真正的類型。 這是一個類型構造函數 ,可用於創建具體類型,如RowDef<string>

在您的特定示例中,您實際上只想要row.GetType() ,它將返回該實例的具體RowDef<T>類型。

或者更好的是,根本不使用Reflection,而是將一個abstract object UntypedValue屬性添加到基類中並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM