繁体   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