2012-05-20 90 views
3

我正在開發一個項目,我遇到的情況是我需要從可查詢對象中「選擇」數據。不幸的是,我不知道編譯時實際可查詢對象的類型是什麼。所以我試圖通過反射來調用「select」方法。我到目前爲止試過的代碼如下。是否可以通過反射調用「Select」方法

.... 
....... 
//suppose that I've got TSource and TResult at runtime. 
Type argumentType = Model.GetArgumentType(); 

//get a queryable object from modle. 
IEnumerable obj = Model.GetQueryableObject(); 

//looking for Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector); 
var selectMethod = typeof(System.Linq.Enumerable) 
        .GetMethods(BindingFlags.Static | BindingFlags.Public) 
        .Where(mi => mi.Name == "Select" &&        
           mi.GetParameters()[1].ParameterType.GetGenericArguments().Count() == 2) 
        .Single() 
        .MakeGenericMethod(new Type[] { argumentType, argumentType }); 

//that is where I have no idea how to do it 
var result = selectMethod.Invoke(null, new object[] { obj, **xxxxxx** }); 
.... 
... 

誰能告訴我怎樣才能做一個「Func<TSource, TResult>」爲selectMethod通過反射來調用「選擇」的方法?謝謝。




更新: 作爲@喬恩飛碟雙向提及。示例代碼中有幾處錯誤。顯然,我可能會以錯誤的方式提問(絕對是我的錯)。所以我決定修改原始問題以使其更清楚(或更糟糕)。希望有所幫助。

+2

你見過動態LINQ嗎? –

+2

你在那個'Func'中究竟想要什麼?它應該做什麼? – svick

+0

Queryable是一個靜態類。你的意思是IQueryable?如果你從Enumerable中找到方法,你爲什麼要使用查詢? –

回答

1

(這個答案曾經只是一個評論。)

它會像

Type funcType = typeof(Func<,>).MakeGenericType(argumentType, argumentType); 

(在你可能woldn't要TSourceTResult是一樣的真實的情況。)

之後,請致電Delegate.CreateDelegate與您的funcType以及您希望放入新代表的任何「選擇功能」。

相關問題