2015-05-28 23 views
0

我是C#的新手,使用C#3.0 需要創建未知數量的對象(不超過50個) 我的想法是將它們存儲在一個ArrayList所以我不必爲它們命名,但仍然可以在需要時訪問它們。 這些對象將具有一些已知屬性,但它們需要具有與它們關聯的其他值。這個數字是未知數,但是很低,小於20-30比方說。 不知道如何處理未知的值。是否有可能我可以將它們存儲在與每個對象關聯的數組中?但我如何提及他們呢? 或者這可以通過接口完成嗎? 我閱讀了關於動態屬性的內容,但它似乎在3.0中不受支持。C#3.0如何將未知數的值與對象關聯

謝謝! -gg2

+0

我不知道我明白了。你需要[動態或**反射**](http://www.codeproject.com/Articles/593881/What-is-the-difference-between)! –

回答

1

我在我工作的領域中經常這樣做。通常,我創建一個包含已知值的對象,然後創建一個索引屬性來保存未知值。該物體看起來是這樣的:

public class KindOfUnknown 
{ 
    private Dictionary<string, object> _metadata = new Dictionary<string, object>(); 

    public object KnownValue1 { get; set; } 
    public object KnownValue2 { get; set; } 
    public object KnownValue3 { get; set; } 
    public object this[string propertyName] 
    { 
     get { return _metadata[propertyName]; } 
     set 
     { 
      _metadata[propertyName] = value; 
     } 
    } 

    public bool ContainsProperty(string propertyName) 
    { 
     return _metadata.ContainsKey(propertyName); 
    } 

} 

這裏有3個已知特性,KnownValue1KnownValue2KnownValue3。您可以用有意義的名稱和具體類型替換它們/根據需要添加或減去更多屬性。

然後有一個索引器屬性,允許您設置/獲取存儲在Dictionary<string, object>中的未知值。你會這樣稱呼它:

var myObject = new KindOfUnknown(); 
myObject["MyCustomProperty"] = "Some value here"; //Does not have to be a string 
myObject.KnownValue1 = SOME_VALUE; 

這裏唯一的缺點是你需要知道你在自定義屬性中存儲了什麼。這些類型將被裝箱,並可能有一些性能問題,但我發現它工作得相當好。

dynamic將無法​​正常工作,因爲您已經發現它不存在於C#3中,即使它沒有正確的使用方式。在C#4中最接近的是從DynamicObject派生出一個類型,它允許您創建「即時」類型的屬性。 dynamic只是推遲檢查「。」右側的對象。直到運行時存在(表面上),它不允許你動態地構造類型。

因此,爲了創建一組未知數量的項目,您應該使用List<T>而不是ArrayList,因爲泛型被引入,這是有效折舊的。要使用它,創建一個新的:

List<KindOfUnknown> myObjects = new List<KindOfUnknown>();

那麼你可以添加到他們喜歡的:

myObjects.Add(new KindOfUnknown() { KnownValue1 = ... });

而且你還可以使用索引和-每個循環,您看合適就像任何其他陣列一樣。與ArrayList相比,使用List<T>的優點是對象未在內存中裝箱。

+0

Ron,非常感謝! 是的,我打算說我打算使用屬於泛型的一部分的列表。 我正在更好地審視你的建議。 從你的文章: myObject [「MyCustomProperty」] =「有些值在這裏」; 這表明我需要爲所有這些未知值創建一個名稱(「MyCustomProperty」),我寧願不這樣做。 我想一個解決方法是創建我自己的索引器(遞增數字)並將其用於「MyCustomProperty」? 再次感謝您的時間,非常感謝! – gg2

+0

您可以隨時使用'List '並在類中包含一個'Add'方法,然後將類中的文本索引器更改爲整數索引。 –

0

您可以嘗試在鏈接到您可能需要的未知屬性的每個對象上保留字典。

+0

Tnanks Barett。我想你是在暗示羅恩貝耶建議的那種觀點。 – gg2

+0

正確!(我揍他一拳,但他用代碼示例的答案顯然更勝一籌!) – Barett