2016-01-12 44 views
4

我有這樣的通用功能:轉換的typeof(T)至T

public List<T> GetList<T>() { 
    var businesType = typeof(T); 
    var databaseType = AutoMapperConfiguration.TypeMapping[businesType]; 

    var databaseEntityList = DataModelAccess.GetEntityList(databaseType); 

    var businessEntityList = Mapper.Map(databaseEntityList, databaseEntityList.GetType(), typeof(List<T>)); 
    return (List<T>)businessEntityList; 

} 

但我想要的東西,而不是調用DataModelAccess這樣的:

DataModelAccess.GetEntityList(databaseType); 

是發送數據庫類型爲通用型,像這樣:

DataModelAccess.GetEntityList<DatabaseType>(); 

爲了有這樣的方法返回像List<T>

謝謝! P.S. DataModelAccess.GetEntityList(數據庫類型)的定義是:

public static List<object> GetEntityList(Type databaseType) 
{ 
    //get data from database 
    //retunt it as List<object> <= and I dont like that 
} 
+4

請告訴我們'DataModelAccess.GetEntityList()'的代碼/定義' –

+0

爲什麼你需要這個?只是不喜歡用Type作爲參數的簽名?這不是一條線,實際上可能不值得。 – sll

+0

我想要這個以便於其他程序員使用(這將是一個庫)。謝謝! –

回答

2

函數很喜歡你的GetList<T>應該解決這個問題你。

public List<T> GetEntityList<T>() { } 

然後,您可以調用它

typeof(DataModelAccess) 
    .GetMethod("GetEntityList") 
    .MakeGenericMethod(databaseType) 
    .Invoke(); 

希望這有助於。

+0

好吧,我不認爲在這種情況下需要反思,他已經有了一個'T'來與 – frikinside

+1

一起工作是的,但他在運行時決定了T(databaseType),所以需要反思。 – jvanrhyn

+0

哦!你是對的,我忽略了這一點!我的錯! 'T'不是所需的類型 – frikinside

2

如果您GetEntityList方法返回一個通用List<object>但它的所有項目都是單一類型的,你可以使用IEnumerable.Cast<T>把它變成一個List<T>:除此之外

List<object> result = DataModelAccess.GetEntityList(databaseType); 
List<T> databaseEntityList = result.Cast<T>().ToList(); 

,沒有你不能調用非泛型方法,但不改變該方法。

+0

嗯,我會盡量使用這個。謝謝! –