6

問題は、ジェネリック型の基本クラスにのみ存在するフィールド(非ジェネリック)のGetValueを取得できないことです。以下のコードスニペットをご覧ください。呼び出し

f.GetValue(a)

次のメッセージで例外をスローします。Type.ContainsGenericParametersがtrueであるタイプのフィールドでは、レイトバウンド操作を実行できません。

class Program
{
    static void Main(string[] args)
    {
        Type abstractGenericType = typeof (ClassB<>);
        FieldInfo[] fieldInfos =
            abstractGenericType.GetFields(BindingFlags.Public |  BindingFlags.Instance);

        ClassA a = new ClassA("hello");
        foreach(FieldInfo f in fieldInfos)
        {
            f.GetValue(a);// throws InvalidOperationhException 
        }
    }
}

internal class ClassB<T>
{
    public string str;
    public ClassB(string s)
    {
        str = s;
    }
}

internal class ClassA : ClassB<String>
{
    public ClassA(string value) : base(value)
    {}
}

この設計では、実際のオブジェクトのインスタンスを作成する前に、まずFieldInfoを取得する必要があります。使用できません

Type typeA = abstractGenericType.MakeGenericType(typeof(string));
FieldInfo[] fieldInfos = typeA.GetFields();

ありがとうございました

4

2 に答える 2

0

問題は、ジェネリッククラスが特定の型で動的にコンパイルされるという点にあると思います。ジェネリック型は次のように定義することもできます

internal class ClassB<T>
{
    public T value;

    public string str;
    public ClassB(string s)
    {
        str = s;
    }
}

そうすると、フィールド「値」の値を取得する際に問題が発生します。回避策は、.GetType() を使用して型を直接取得するか、アクセスするフィールドを含むジェネリック引数なしで新しい基本クラスを作成することです。

于 2012-07-12T00:15:26.970 に答える