2017-01-23 124 views
-2

我的問題的列表類型包括此代碼:C#泛型方法的返回類型從

public static class MyStaticClass { 
    public class MyClass { 
     public List<object> MyObjects; 
     public List<Type> MyTypes; 

     public MyClass() { 
      MyObjects = new List<object>(){ 1, 0.5F }; 
      MyTypes = new List<Type>(){ typeof{int), typeof(float) } 
     } 

     public T GetObject<T>(int index) { 
      // Should return an instance of type MyTypes[index], and not object 
      return MyObjects[index] as MyTypes[index]; 
     } 
    } 

    public static void Main() { 
     MyClass myClass = new MyClass(); 
     int arg1 = myClass.GetObject(0); 
     float arg2 = myClass.GetObject(1); 
     MyMethod(arg1, arg2); 
    } 

    public static void MyMethod(int arg1, float arg2) { 
     // Does something 
    } 
} 

我想MyClass存儲混合類型和長度可變的列表。我知道這樣做的唯一方法是通過存儲List<object>。不過,我想在一個方法使用的MyClass.MyObjects值,但如果我只是得到的值作爲object,然後將其發送一個錯誤,它無法轉換對象整數,浮點,等等

的問題是我知道MyObjects中的對象的確切子類型,但是我找不到將MyClass.GetObject中的T設置爲MyTypes[index]類型的方法。我發現的唯一的解決辦法是使用

int arg1 = myClass.MyObjects[0] as int; 
float arg2 = myClass.MyObjects[1] as float; 

不過,我想這是因爲我只需要設置類型的對象一次,然後只用MyTypes自動投在MyObjects的對象。

在此先感謝。

+3

調用方法仍然應該知道在每個索引處存儲哪種類型。你用這個代碼試圖達到什麼目的? –

+0

那麼,爲什麼不只是投射到「T」呢? (是的,這是合法的,轉換將在運行時發生。)您是否期望需要檢測'T'和'MyTypes [index]'之間的不匹配? –

+0

即使你可以在你的方法中進行轉換,調用代碼仍然必須知道要作爲通用參數傳遞的類型。但是,如果你的調用代碼知道實際的類型,我無法看到將返回的對象轉換爲該特定類型的問題 – HimBromBeere

回答

0

我想我知道錯誤在哪裏。如果我有一個簽名需要的方法,例如一個int,那麼編譯器無法知道如果我已經完成的對象已經投射到某個Type(即使Type引用int),該對象是否已經投射到int。對我而言,創建MyMethod副本只需要objects,然後在該方法中將其轉換爲子類型,然後使用子類型簽名運行MyMethod

0

存儲類型是多餘的,因爲每個對象本身已經存儲了類型信息。

你可以把結果或顯式定義的類型,這裏是後者:

public static class MyStaticClass { 
    public class MyClass { 
     public List<object> MyObjects; 

     public MyClass() { 
      MyObjects = new List<object>(){ 1, 0.5F }; 
     } 

     public T GetObject<T>(int index) { 
      var item = MyObjects[index]; 
      if(typeof(T) != item.GetType()) 
       throw new InvalidCastException(); 

      return (T) item; 
     } 
    } 

    public static void Main() { 
     MyClass myClass = new MyClass(); 
     int arg1 = myClass.GetObject<int>(0); 
     float arg2 = myClass.GetObject<float>(1); 
     MyMethod(arg1, arg2); 
    } 

    public static void MyMethod(int arg1, float arg2) { 
     // Does something 
    } 
} 

您可以在任何物體上使用的GetType(),所以如果你有不明物體的集合,你可以只圖在運行時輸出它們的類型並相應地執行。