我正在尝试创建一个具有2个属性的自定义objet" InventorAttribue"的Collection(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"类代表最终的自动发明家属性集存储在发明人的对象中。这是我的问题所在的类,因为当然,由于找不到类型的" 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>
注意:您无法在Attributes
集合中使用不同的T
类型的参数存储InventorAttribute<T>
。即使您可以做到这一点,您将如何消费这种收藏?您需要将每个属性的Value
施放为适当的类型。您将在这里拥有通用课,您将没有任何好处。因此,创建将存储在object
类型的属性中的非生成InventorAttribute
。
您可能会想象某种形式的继承。它在这里不存在。
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
S,直到您施放更具体的类型。
就类型系统而言,
1 。作为一个实现详细信息,该系统只能巧妙地将每个方法的一个版本的单个版本用于所有参考类型。但这对类型系统没有任何明显的影响。