我在我工作的領域中經常這樣做。通常,我創建一個包含已知值的對象,然後創建一個索引屬性來保存未知值。該物體看起來是這樣的:
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個已知特性,KnownValue1
,KnownValue2
和KnownValue3
。您可以用有意義的名稱和具體類型替換它們/根據需要添加或減去更多屬性。
然後有一個索引器屬性,允許您設置/獲取存儲在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>
的優點是對象未在內存中裝箱。
我不知道我明白了。你需要[動態或**反射**](http://www.codeproject.com/Articles/593881/What-is-the-difference-between)! –