[英]how to create a collection of a type that has a generic value type argument
我正在嘗試創建具有2個屬性的自定義對象“ InventorAttribue”的集合(list <>或IEnumerable <>); 名稱和值。
“ Value”屬性可以是各種類型,因此我想到了像這樣編碼該對象:
public class InventorAttribute<T> {
public InventorAttribute (string name, T value) {
Name = name;
Value = value;
}
public string Name { get; set; }
public T Value { get; set; }
}
此外,我計划使用“ AttiributeSet”類來表示要存儲在Inventor對象中的最終Autodesk Inventor AttributeSet。 這是類,也是我的問題所在的位置,因為當然,此代碼不起作用,因為找不到類型“ T”(!)
public class AttributeSet
{
public AttributeSet(string category, string name {
Name = name;
Attributes = new List<InventorAttribute<T>>();
}
public string Category { get; set; }
public string Name { get; set; }
public List<InventorAttribute<T>> Attributes { get; set; }
public void AddAttribute(string name, T value){
Attributes.Add(new InventorAttribute<T>(name,value));
}
}
題:
我該如何設法編寫此代碼,以及如何僅在運行時通過“ AddAttribute”方法傳遞“ InventorAttribute.Value”類型。
在此先感謝您的幫助。
您的AttributeSet
類也應參數化:
public class AttributeSet<T>
注意:您不能將參數化為具有不同T
類型的InventorAttribute<T>
存儲在Attributes
集合中。 即使您可以做到這一點,您將如何消費此類收藏? 您將需要將每個屬性的Value
強制轉換為適當的類型。 在這里擁有通用類將不會有任何好處。 因此,創建非通用的InventorAttribute
會將值存儲在object
類型的屬性中。
您可能正在想象某種形式的繼承。 它在這里不存在。
InventorAttribute<string>
不是 InventorAttribute<T>
的子類。 它也不是InventorAttribute<object>
的子類(我提到這一點是因為通常這是人們下一步嘗試定義集合的項目類型)。 每個構造的泛型類型實際上都是獨立的1 。
如果適用,您可以引入一個新的基類:
public abstract class InventorAttribute {
public string Name { get; set; }
public InventorAttribute (string name) {
Name = name;
}
}
public class InventorAttribute<T> : InventorAttribute {
public InventorAttribute (string name, T value) : base(name) {
Value = value;
}
public T Value { get; set; }
}
現在,您可以聲明您的集合為非通用類型InventorAttribute
。 但是,現在,您必須轉換為更特定的類型,才能訪問Value
。
1就類型系統而言。 作為實現細節,系統能夠巧妙地將每個方法主體的單個版本JIT適用於所有引用類型。 但這對類型系統沒有任何可見的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.