4

奇妙ですが、ソースコード

public class Processor<T> where T: class
{
...
    private object WorkWithSubtype(IRequester nextRequester, Type type)
    {
        if (type.GetInterface("IList") != null)
        {
            var originalType = type.GetGenericArguments()[0];
            var list = Activator.CreateInstance(type);

            var method = typeof(Processor<>).GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(originalType);
            var resList = method.Invoke(this, new object[] { nextRequester });
            typeof(List<>).GetMethod("AddRange").MakeGenericMethod(originalType).Invoke(list, new object[] { resList });
            return list;
        }
    }

    private IEnumerable<K> GetObjects<K>(IRequester requester) where K: class
    {
        ...
        //We can call method WorkWithSubtype in this method sometimes
    }
}

そして、「ContainsGenericParametersがtrueである型またはメソッドではレイトバウンド操作を実行できません。」というメッセージが表示されます。例外は、行'var resList = method.Invoke(this、new object [] {nextRequester});'でスローされます。手伝って頂けますか?前もって感謝します!

4

2 に答える 2

5

2つの汎用パラメーターがあります。1つはProcessorクラス用です。もう1つはGetObjectsメソッド用です。ジェネリックメソッドを作成する際に、メソッドの型パラメーターに型引数を指定しましたが、クラスのジェネリックパラメーターに型引数を指定していません。

プロセッサクラスの目的に応じて、次のいずれかの解決策を試すことができます。

  • type引数を使用して閉じたジェネリック型を作成する
  • リフレクションを使用するtypeof(Processor<T>)のではなく、クローズドジェネリック型を構築するために使用する
  • クラスからtypeパラメーターを削除します
  • メソッドからtypeパラメーターを削除します

私は2番目があなたが探しているものである可能性が最も高いと思います:

var method = typeof(Processor<T>)
    .GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance)
    .MakeGenericMethod(originalType);

さらに、AddRangeこれは一般的な方法ではありません。むしろ、List<>ジェネリック型なので、次のようになります。

typeof(List<>)
    .MakeGenericType(originalType)
    .GetMethod("AddRange")
    .Invoke(list, new object[] { resList }); 
于 2012-04-16T19:58:14.960 に答える
0

次のようにMakeGenericTypeを使用する必要があります。

var method = typeof(Processor<>).MakeGenericType(typeof(T)).GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(originalType);

同様に、メソッドを呼び出すときAddRange

問題は、それList<string>.AddRangeがとは異なるメソッドでList<int>.AddRangeあり、MakeGenericTypeがtypeパラメーターをクラスに適用することです。GetObjectsには、含まれているクラス(T)とは異なるジェネリック型パラメーター(K)があるため、MakeGenericMethodを呼び出す必要があります。

于 2012-04-16T19:59:23.757 に答える