2017-02-16 64 views
0

我試圖創建具有2個屬性的自定義對象「InventorAttribue」的集合(列表<>或IEnumerable <>;名稱和價值。如何創建具有通用值類型參數的類型的集合

「值」屬性可以是各種類型的,所以我認爲編碼該對象像這樣的:

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」類來表示最終的Autodesk Inventor AttributeSet中是存儲在Inventor的對象中。這裏是類並在我的問題表示,因​​爲當然,這個代碼不作爲類型「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」類型。

在此先感謝非常感謝幫助。

+0

嗨,夥伴們,謝謝你的快速解答。 有效地,我有點想用某種繼承(Interface也許)。 最後,我用「對象」作爲「值」屬性類型。目前,性能實際上不是問題,現在... –

回答

1

AttributeSet類也應被參數:

public class AttributeSet<T> 

注意:你不能存儲在Attributes採集參數化不同類型TInventorAttribute<T>。即使你可以這樣做,你會如何消費這樣的收藏?您需要爲每個屬性投入Value以適當的類型。在這裏你不會有任何通用類的好處。因此,創建非通用的InventorAttribute,它將存儲屬性爲object類型的值。

1

您可能正在想象某種形式的繼承。它在這裏不存在。

An InventorAttribute<string> is notInventorAttribute<T>的一個子類。它也不是InventorAttribute<object>的一個子類(我提到這一點,因爲它通常是人們下一次嘗試定義集合的項目類型)。每個構建的通用類型實際上是獨立的。

如果適用,您可以引入新的基類:

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,直到你投射到更具體的類型。


至於類型系統關注。作爲細節,系統能夠巧妙地僅適用於適用於所有參考類型的每個方法主體的單個版本。但是這在類型系統中沒有任何可見的影響。

相關問題