2014-09-11 58 views
0

這裏是我的代碼轉換通用變量,以特定的類類型

public class MaterialRepository<T> where T : Material, new() 
    { 
     public List<T> ListMaterial { get; set; } 

     public MaterialRepository(List<T> listMaterial) 
     { 
      ListMaterial = new List<T>(); 
      ListMaterial = listMaterial; 
     } 

    public T SearchMaterial(T inputMaterial) 
    { 
     T resultMaterial = new T(); 
     if (typeof(T) == typeof(BendingMaterial)) 
     { 
      //do something here   
     } 

     return resultMaterial; 

    } 

我的問題是如何轉換resultMaterial到一個特定的派生類材料(BendingMaterial)? 也在//在這裏做點什麼..部分,如何ListMaterials是通用的,如何在ListMaterials中使用BendingMaterial特定屬性找到BendingMaterial?

回答

0

假設你有類,如它們與其它屬性,方法,和你有什麼:

public class Material 
{ 
    public decimal Density { get; set; } 
} 

public class BendingMaterial : Material 
{ 
    public string Bendability { get; set; } 
} 

public class OtherMaterial : Material 
{ 
    public bool IsOther { get; set; } 
} 

然後在你的方法,您可以編寫這樣的代碼以獲取「材質列表」對象和訪問中各個列表項的子類型他們的特定屬性和方法就像這樣。這應該適用於列表T,即使您不使用where T:Material約束,因爲即使您將Checkbox或對象放入純粹通用列表中,「if(m BendingMaterial)」也會匹配預期的材質並相應處理。

List<T> ListMaterial = new List<Material>(); 
ListMaterial .Add(new BendingMaterial()); 
ListMaterial .Add(new OtherMaterial()); 

foreach (Material m in ListMaterial) 
{ 
    if (m is BendingMaterial) 
    { 
     string x = (m as BendingMaterial).Bendability; 
    } 
    if (m is OtherMaterial) 
    { 
     bool y = (m as OtherMaterial).IsOther; 
    } 
} 
//more code 
+0

這也是可能的,但我必須重新編寫我的其他方法,有沒有辦法可以resultMaterial轉化爲具體的?什麼樣T resultMaterial =新BendingMaterial()? – Blues 2014-09-11 03:55:01

+0

好,如果你的意圖是將resultMaterial變量當作BendingMaterial來對待,假設你已經完成了一次類型檢查,並且你知道你不會得到一個運行時錯誤來試圖進行這種轉換,那麼你可以做BendingMaterial b =(runtimeMaterial作爲BendingMaterial);然後訪問彎曲的屬性和方法材料。 T resultMaterial = new BendingMaterial()會編譯,但可能不會在每種情況下都做到這一點。它讓你遠離泛型,但你也可以考慮Material m = new BendingMaterial();因爲你知道你有一個材料列表。 – 2014-09-11 04:28:30

+0

管理修復它我改變了返回類型爲材質而不是T,'材料m = new BendingMaterial();'做了竅門,感謝您的幫助! – Blues 2014-09-11 04:40:53

0

嘗試

BendingMaterial m = (BendingMaterial)(object)mrep.SearchMaterial(inpm); 

List<BendingMaterial> b = ListMaterial.OfType<BendingMaterial>().ToList();