2016-05-02 12 views
4

のメソッドを呼び出すすべての人、リフレクション:ジェネリックパラメータ

リフレクションでメソッドを呼び出すときに問題があります。

方法記号は、私は2番目のオーバーロードを使用したい

public T Create<T, TK>(TK parent, T newItem, bool updateStatistics = true, bool silent = false) 
     where T : class 
     where TK : class; 
    public T Create<T, TK>(TK parent, string newName, Language language = null, bool updateStatistics = true, bool silent = false) 
     where T : class 
     where TK : class; 

です。

私のコードは、項目がクラスである

typeof(ObjectType).GetMethod("Create") 
      .MakeGenericMethod(new Type[] { typeof(Item), typeof(TKparent) }) 
      .Invoke(_objectInstance, new object[] { parent, name, _language, true, false }); 

で、TKparentは型変数であると親がTKparentインスタンスです。

System.Reflection.AmbiguousMatchExceptionが発生します。

私は問題がジェネリック医薬品に関連していると思う

私も試してみましたこの:

typeof(ObjectType).GetMethod("Create", new Type[] { typeof(TKparent), typeof(string), typeof(Globalization.Language), typeof(bool), typeof(bool) }) 
      .MakeGenericMethod(new Type[] { typeof(Item), typeof(Tparent) }) 
      .Invoke(_objectInstance, new object[] { parent, name, _language, true, false }); 

が、この場合には、私はSystem.NullReferenceException(見つかりませ法)

でき、誰の助けを得る

これで、私は怒っている!

は、問題は、あなたも、あなたが望むオーバーロード、それを伝える前 GetMethodはそのたてがみと 複数方法を見つけることであるあなたに

答えて

2

に感謝します。 GetMethodのオーバーロードは、型の配列を渡すことを可能にしますが、ジェネリックではないメソッドに対しても機能しますが、パラメータは汎用的なので使用できません。

あなたはGetMethodsを呼び出して、あなたが望むものに絞り込む必要があります。

var methods = typeof(ObjectType).GetMethods(); 

var method = methods.Single(mi => mi.Name=="Create" && mi.GetParameters().Count()==5); 

method.MakeGenericMethod(new Type[] { typeof(Item), typeof(TKparent) }) 
     .Invoke(_objectInstance, new object[] { parent, name, _language, true, false }); 

あなたはインラインすべてのことをしたい場合は明らかにできましたが、あなたは別々の行にそれを分ける場合、それは簡単にデバッグを行います。