2016-05-12 30 views
-1

在用戶定義的類中,我想讓列表的類型不明確,以便可以在不同的實例中包含字符串或整數或元組的列表(也就是說,每個列表將只有一種類型,但類的不同實例會有不同的類型)。我目前有類似的東西:將類別列表放在模糊的類中直到填充

public Result 
{ 
    private List<dynamic> _vaguelist; 
    public List<dynamic> vaguelist { 
     get 
     { 
      return _vaguelist; 
     } 
     set 
     { 
      _vaguelist = value; 
     } 
    } 
} 

但是,我很確定我沒有正確使用動態類型。我想我需要一個構造函數來創建一個新的List,其中T由GetType()的第一個值添加到Class中確定。或者在被初始化時寫入列表被指定爲某種類型。

簡而言之,如何在一個類中定義一個列表,使其值的類型既可以是添加到列表中的固有值,也可以是在類實例化時指定的值。 (單個列表中的值都將是一種類型)。

+10

這聽起來像你需要去和[閱讀泛型](https://msdn.microsoft.com/en-gb/library/512aeb7t.aspx)。 –

+1

爲什麼不讓'Result'通用? –

+0

你是否想用不同類型的列表同時填充列表,即使用異構類型? – TaW

回答

3

我想你有兩個選擇,第一個選擇最好的方法,只有當你知道該列表將是某種類型時纔會工作。

public class Result<T> 
{ 
    private List<T> _vaguelist = new List<T>(); 
    public List<T> vaguelist { 
     get 
     { 
      return _vaguelist; 
     } 
     set 
     { 
      _vaguelist = value; 
     } 
    } 
} 

Result a = new Result<string>(); 
a.vaguelist.Add("1234"); 
Result b = new Result<int>(); 
a.vaguelist.Add(1234); 

,如果你wan't添加多種類型的進榜啊,你不會知道你把什麼進入榜單

public class Result 
{ 
    private List<object> _vaguelist; 
    public List<object> vaguelist { 
     get 
     { 
      return _vaguelist; 
     } 
     set 
     { 
      _vaguelist = value; 
     } 
    } 
} 

Result a = new Result(); 
a.vaguelist.Add("1234"); 
a.vaguelist.Add(1234); 

有問題的第二個方案將工作這種方法是,你將不得不投入列表中的每一個項目,以利用項目的類型。


利用第一種方法,你可以實現這樣的:

public class Result<T> 
{ 
    private List<T> _vaguelist = new List<T>(); 
    public List<T> vaguelist { 
     get 
     { 
      return _vaguelist; 
     } 
     set 
     { 
      _vaguelist = value; 
     } 
    } 
} 

public abstract class Result 
{ 
    public static Result<T> NewResultFromItem<T>(T item) 
    { 
     Result<T> result = new Result<T>(); 
     result.vaguelist.Add(item); 

     return result; 
    } 
} 

string item1 = "123"; 
string item2 = "234"; 
var result = Result.NewResultFromItem(item1); 
result.vaguelist.Add(item2); 
+0

列表將只包含一個類型,所以示例「1」非常適合。但是你能解釋一下你的例子「1」的實現嗎?這是否只是在實例化中省去顯式類型轉換的麻煩? – ncarmona

+0

@ncarmona這是正確的,具有'NewResultFromItem'方法的抽象類將允許您創建一個新的'Result '類,而不必擔心明確投射它。無論如何,你總是可以使用'新的結果',它會工作。 –

+0

我得到一個NullReferenceException爲「vaguelist」陳述「對象引用未設置爲對象的實例。」在這裏出現一個肢體,但是我需要在第一次添加一些東西時實例化列表?我的想法是,因爲編譯器不能隱式地爲列表轉換類型,所以它可能需要顯式實例化。 – ncarmona

1

你問的這兩個類型安全和類型不可知論(我只是做了這個詞),你不能有兩個在同一時間。假設你會找到一種方法,當添加第一個項目時,在列表中將列表翻轉爲類型安全的集合。如果您無法對其進行編碼,那麼誰或能夠如何使用它?編譯器不會知道它在運行時將會發生什麼,所以對於類型安全來說沒有太多可以做的事情。在運行時,你仍然必須弄清楚你在處理什麼,所以從編碼的角度來看,它仍然只是一個對象列表。