如何创建具有泛型值类型参数的类型的集合

时间:2017-02-16 15:04:45

标签: c#

我正在尝试创建具有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”类型。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您的AttributeSet课程也应该参数化:

public class AttributeSet<T>

注意:您无法在InventorAttribute<T>集合中存储T参数化的不同Attributes类型。即使你能做到这一点,你会如何消费这样的收藏?您需要将每个属性的Value转换为适当的类型。你在这里拥有通用课程没有任何好处。因此,请创建非通用InventorAttribute,它会将值存储在object类型的属性中。

答案 1 :(得分:1)

你可能想象某种形式的继承。它不存在。

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仅适用于所有引用类型的每个方法体的单个版本。但这对类型系统没有任何明显的影响。