2013-03-27 32 views
1

我一直在閱讀這篇文章,而且這些文章看起來都與我已經非常接近的情況相符。我有一個類與以下方法:如何使用多種通用匹配方法獲取MethodInfo

IQueryable<TBusinessContract> Query<TBusinessContract>(
    Expression<Func<TBusinessContract, bool>> condition, params string[] children) 
    where TBusinessContract : BusinessContract; 

IQueryable<TSubType> Query<TSuperType, TSubType>(
    Expression<Func<TSubType, bool>> condition, params string[] children) 
    where TSuperType : BusinessContract 
    where TSubType : BusinessContract; 

我想要一個MethodInfo的第一個。我已經嘗試了許多不同的組合和排列組合,並且我得到null或模糊匹配異常。我想出了以下的工作,但感覺有點遺憾。

MethodInfo queryMethod = Dal.GetType() 
    .GetMethods(BindingFlags.Public | BindingFlags.Instance) 
    .Where(mi => mi.Name == "Query") 
    .Where(mi => mi.IsGenericMethod) 
    .Where(mi => mi.GetGenericArguments().Length == 1) 
    .SingleOrDefault(); 

這是我能做的最好的或者我錯過了什麼?我使用.NET 4.5。

+0

我確實讀過這篇文章,甚至試過他的代碼,它仍然爲我返回null。也許更基本的問題是弄清楚如何獲得正確的參數類型。 typeof(Expression <>)不起作用,並且typeof(表達式>)甚至不能編譯。 – 2013-03-28 17:13:54

回答

1

對於這些情況似乎沒有真正好的反射方法。我認爲你做的很好。寫了一點點緊湊:

MethodInfo queryMethod = Dal.GetType().GetMethods() 
    .SingleOrDefault(mi => mi.Name == "Query" && 
    mi.GetGenericArguments().Length == 1); 

即使你的類型包含非通用方法,也叫Query,它看起來像GetGenericArguments會表現很好,並返回一個空(零長度)陣列。

相關問題