我正在尝试创建具有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”类型。
提前感谢您的帮助。
答案 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仅适用于所有引用类型的每个方法体的单个版本。但这对类型系统没有任何明显的影响。