使用泛型和反射可能有點乏味。你最好的選擇(保持簡單)就是使用GetMethods
,並根據你的要求進行過濾。
//Overly simplified
MethodInfo joinMethod = typeof(Queryable)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(m => m.Name == "Join" && m.GetParameters().Length == 5)
.First();
鑑於此,MethodInfo
此時不可調用。您需要使用joinMethod.MakeGenericMethod(/*type array*/)
來製作它的通用版本。在你的情況下,你需要使用4種類型:TOuter,TInner,TKey,TResult。
var genericJoinMethod = joinMethod.MakeGenericMethod(new Type[]{your types here});
現在您可以像預期的那樣使用genericJoinMethod
了。
據我所知,如果你不知道編譯時的類型,這是唯一的方法。
編輯:
考慮您的意見,我認爲它應該是這個樣子:
MethodInfo joinMethod = typeof(Queryable)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(m => m.Name == "Join" && m.GetParameters().Length == 5)
.First();
var genericJoinMethod = joinMethod.MakeGenericMethod(typeof(TType), typeof(TType), JoinKeyType, typeof(TType));
result = genericJoinMethod.Invoke(result, new object[] { result, items, OuterKeySelector, InnerKeySelector, ResultSelector });
請記住'Queryable.Join'是一個擴展方法,所以方法的第一個參數是'this IQueryable'。另外,[this](http://stackoverflow.com/questions/269578/get-a-generic-method-without-using-getmethods)問題非常相似。 –
vcsjones
哦,是的!謝謝。我會看一看。 – uni