2016-01-06 93 views
0

我有這些在運行時被調用的實體,我需要能夠返回一個IQueryable<EntityObject>根據字符串被稱爲特定時間的實體類型。比方說,實體是食物的種類和類名是Food,所以...如何通過反射來獲取和使用類/實體類型?

return Repository.Read<Food>(); //this is what I am trying to accomplish 

不過,我不知道這是Food直到運行,並只等給出一個字符串,所以我使用反射:

Type t = Type.GetType(lookupEntityName); //where lookupEntityName = "Food" 

如何使用這個Type t從上面取代「食品」在代碼的原始行:

return Repository.Read<HERE>(); // use 't' to repalce "HERE" 

回答

0

Supposin摹你的方法只包含一個return語句(因爲你只有張貼),你可以做這樣的事情(警告:這是未測試):

public static IQueryable<T> Read<T>() 
{ 
    return Repository.Read<T>(); 
} 

而且你可以使用這樣的:

IQueryable<Food> food = Read<Food>(); 
0

您必須使用MethodInfo.MakeGenericMethod Method在運行時創建泛型方法。

var openMethod = typeof(Repository).GetMethod(nameof(Repository.Read), ...); 
var closedMethod = openMethod.MakeGenericMethod(t); 
return closedMethod.Invoke(...); 
0

如果您需要調用一個泛型方法,你必須得到該函數的MethodInfo的和此時,相應的類型創建一個通用的MethodInfo。

這是一個輔助函數來做到這一點:

public MethodInfo GetGenericMethod(string MethodName, Type SourceType, Type TargetType) 
{ 
    var mInfo = SourceType.GetMethod(MethodName); 
    return mInfo.MakeGenericMethod(TargetType); 
} 

現在你可以這樣做:

Type t = Type.GetType(lookupEntityName); 
Type tSrc = typeof(Repository); 

var result = GetGenericMethod("Read", tSrc, t).Invoke(Repository); 

如果閱讀是一個靜態方法,然後傳遞null的調用。

相關問題