0

私は次のクラスを持っています

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

このような「値」プロパティの値を取得するためにリフレクションを使用しようとしています

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 が true であるタイプまたはメソッドに対して実行できません。

問題を解決するために何ができますか?

4

1 に答える 1

1

エラーが伝えようとしているので、RowDef<>直接使用しても意味がありません。 RowDef<>実際にはタイプではありません。のような具体的な型を作成するために使用できる型コンストラクターRowDef<string>です。

あなたの特定の例では、実際には、そのインスタンス row.GetType()の具象型を返すだけが必要です。RowDef<T>

または、Reflection をまったく使用せず、代わりにabstract object UntypedValue基本クラスにプロパティを追加して使用することをお勧めします。

于 2015-07-02T13:57:49.873 に答える