1

編集:これを内部で実行しようとしているクラス/メソッドは静的であるため、これをgeneric.Invokeに渡すことができません

さまざまなソースからのデータを自動的に解析するために使用する静的データ アクセス クラスがあります。問題に遭遇したとき、私はそれをリファクタリングし始めていました。リフレクションを介してジェネリック メソッドに Type を渡そうとしています (メソッドは型を解析し、Type に値を返します)。私のコードは現在次のようになっています。

Type type1 = typeof( T );
var item = (T)Activator.CreateInstance( typeof( T ), new object[] { } );

foreach (PropertyInfo info in type1.GetProperties())
{
    Type dataType = info.PropertyType;
    Type dataType = info.PropertyType;
    MethodInfo method = typeof( DataReader ).GetMethod( "Read" );
    MethodInfo generic = method.MakeGenericMethod( dataType ); 
    //The next line is causing and error as it expects a 'this' to be passed to it
    //but i cannot as i'm inside a static class
    generic.Invoke( this, info.Name, reader );
    info.SetValue(item,DataReader.Read<dataType>(info.Name, reader ) , null);
}
4

2 に答える 2

0

ジェネリックメソッドのtypeパラメーターはType;のインスタンスではありません。この方法で変数を使用することはできません。ただし、リフレクションを使用して、必要なクローズドジェネリックを作成できMethodInfoます(つまり、typeパラメーターを指定して)。これは次のようになります。

// this line may need adjusting depending on whether the method you're calling is static
MethodInfo readMethod = typeof(DataReader).GetMethod("Read"); 

foreach (PropertyInfo info in type1.GetProperties())
{
    // get a "closed" instance of the generic method using the required type
    MethodInfo genericReadMethod m.MakeGenericMethod(new Type[] { info.PropertyType });

    // invoke the generic method
    object value = genericReadMethod.Invoke(info.Name, reader);

    info.SetValue(item, value, null);
}
于 2013-03-22T15:25:13.977 に答える