2013-03-13 203 views
2

我有兩種類型的人員和組織都從IContact繼承。如何使用從不同方法返回的類型調用泛型方法?

我有一個返回基於某種邏輯,這些類型中的一種方法

private Type GetPersonOrOrganisation(string some variable) 
{ 
    either returns Person or Organisation type 
} 

我有查詢的個人或機構]數據庫的方法:

public static IQueryable<T> Query<T>(this IUow uow) where T : IContact 
     { 
      return uow.Query<T>(); 
     } 

我的問題是如何能我使用從GetPersonOrOrganisation返回的類型來調用查詢。

所以說:

var contactType = GetPersonOrOrganisation(string some variable); 

var contact = Query<contactType>(); 

其中contactType將或者個人或組織。

很明顯,這不會編譯,這是我的問題。如何根據從GetPersonOrOrganisation返回的內容從數據庫中進行正確類型的查詢。

+0

爲什麼沒有IContact GetPersonOrOrganisation(字符串一些變量)的任何原因? – weismat 2013-03-13 07:46:52

+0

是的,我需要該類型來調用查詢,因爲查詢方法要求類型不是該類型的實際對象。 – user2005657 2013-03-13 07:52:27

回答

0

你不能那樣做。 但是,你試圖完成什麼?

請考慮使用ArrayList或List來代替。至於修改的查詢將返回哪些類型,你可以調整這樣的方法:

public static IQueryable<T> Query<T>(this IUow uow, Type returnType) where T : IContact 
{ 
    if(returnType is IContact) // code here 
} 

即快速代碼可能有錯誤。

這個計算器的鏈接已經有關於這個討論: using type returned by Type.GetType() in c#

2

Type和仿製藥之間的移動是一個重大的痛苦;沒有重構的唯一答案是:反射;像這樣:

var method = typeof(SomeType).GetMethod("Query").MakeGenericMethod(contactType); 
// this is to getch your Query<T>(this IUow) method 

var contact = (IContact)method.Invoke(null, new object[] { uow }); 

這是非常可怕的。如果可能的話,我建議您將Query<T>方法改寫爲Query(Type type)方法(返回IContact),該方法仍然可以通過return (T) Query(typeof(T));通過Query<T>輔助方法獲取現有代碼。然而事實並非如此。

如果你傳遞一個類型T的實例爲的方法,也有一些技巧,你可以做simplfiy由此,利用dynamic執行型/泛型/方法解析爲您服務。