2010-05-05 39 views
1

我想使用由PropertyType返回的類型來創建一個類型化的函數。我發現這種類似的 using type returned by Type.GetType() in c# 但這提到了如何創建一個列表,但沒有提到我們如何創建一個Func <>。請幫助我。如何動態使用PropertyType反射屬性來創建相應類型的函數<>?

僞代碼:

PropertyInfo inf = typeof(SomeClass).GetProperty("PropertyName"); 
Type T=inf.PropertyType; 
Expression<Func<SomeClass,T>> le = GetPropertyOrFieldByName<SomeClass,T>("PropertyName"); 

static Expression<Func<TSource, TResult>> GetPropertyOrFieldByName<TSource,TResult>(string propertyOrFieldName) 
{ 
ParameterExpression item = Expression.Parameter(typeof(TSource), "expr");MemberExpression prop = LambdaExpression.PropertyOrField(item, propertyOrFieldName); 
var expr = Expression.Lambda<Func<TSource, TResult>>(prop, new ParameterExpression[] { item }); 
expr.Compile(); 
return expr; 
} 
+0

你可以顯示一些你想達到的僞代碼嗎?你的問題有點含糊。 – Steven 2010-05-05 18:35:20

+0

你想創建委託的實例還是什麼? – Andrey 2010-05-05 18:35:51

+0

對不起,如果它有點模糊...這是一些代碼..這是我想做的事情... PropertyInfo inf = typeof(SomeClass).GetProperty(「PropertyName」); 類型T = inf.PropertyType; 表達式> le = GetPropertyOrFieldByName (「PropertyName」); – Vishal 2010-05-05 18:37:36

回答

1

如果你要撥打的GetPropertyOrFieldByNamePropertyType,這應該工作:

PropertyInfo inf = typeof(SomeClass).GetProperty("PropertyName"); 
Type T = inf.PropertyType; 

object le = 
    typeof([TypeThatDeclaresMethod]).GetMethod("GetPropertyOrFieldByName") 
    .MakeGenericMethod(typeof(SomeClass), T) 
    .Invoke(null, new object[] { "PropertyName" }); 

假設GetPropertyOrFieldByName方法是一個公共靜態方法。

+0

嗨我試圖使用上述方法,但得到一個空引用異常...我想從方法中獲取一個列表,TypeThatDeclaresMethod意味着類具有方法或返回類型?.sorry我是新來的反射..所以我已經將GetPropertyOrFieldByName添加到問題上面的代碼中。請幫助我出 – Vishal 2010-05-05 19:41:51

+1

'[TypeThatDeclaresMethod]'是類的名稱方法。所以如果你有一個名爲'Program'的類包含'GetPropertyOrFieldByName',那麼你的調用將會是:typeof(Program).GetMethod(「GetPropertyOrFieldByName」)'。 – Steven 2010-05-06 06:08:13

+0

嗨,謝謝..實際上我沒有公開的方法,所以它現在返回null我有一個對象變量具有擴展值,所以我把它轉換爲tostring,所以我如何使用這個字符串變量作爲表達式? – Vishal 2010-05-06 15:01:42

1

只需使用MakeGenericType(new Type[] { SomeClass, T })

編輯更多細節:

Type T2 = typeof(Excpression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(new Type[] { SomeClass, T })); 
... Activator.CreateInstance(T2); 

1

您可以創建表達式樹,但你不能宣佈對碼型。當你有這樣的:

Expression<Func<SomeClass,T>> le = ... 

T具有被稱爲編譯時(或者是一個類型參數)。相反,您的T變量,其值僅在執行時間處已知。

現在,下一個問題是你是否真的需要呢 - 或你需要什麼方式。你想表達什麼?你可以使用非泛型Expression類作爲變量類型嗎?

如果你真的想要一個表達式樹,你不需要擔心MakeGenericType等 - 使用Expression.Property方法。

1
Type parameter = ...; 
Type result = ...; 
Type your_type = typeof(Func<,>).MakeGenericType(new Type[] {parameter, result}); 
相關問題