簡體   English   中英

如何創建具有通用值類型參數的類型的集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM