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