限制方法/构造函数中的“类型”参数

时间:2017-04-05 16:09:10

标签: c# generics types parameters attributes

我想将Type参数传递给构造函数。此构造函数属于属性。

这很简单。但是,如何将此Type参数仅约束到特定类的子类?

所以我有一个父类ParentClass和两个子类MyChildClass : ParentClassMyOtherChildClass : ParentClass

我的属性如下所示:

public class AssociatedTypeAttribute : Attribute
{
    private readonly Type _associatedType;

    public Type AssociatedType => _associatedType;

    public AssociatedTypeAttribute(Type associatedType)
    {
        if (!associatedType.IsSubclassOf(typeof(ParentClass)))
            throw new ArgumentException($"Specified type must be a {nameof(Parentclass)}, {associatedType.Name} is not.");

        _associatedType = associatedType;
    }
}

这是有效的,并且在运行时它会在类型不是ParentClass时抛出异常 - 但是运行时太晚了。

是否可以添加某种约束?我可以在这里使用泛型,还是我正确地说泛型是超出范围的,因为它是属性的构造函数?

注意用法:

public enum MyEnum
{
   [AssociatedType(typeof(MyChildClass))]
   MyEnumValue,
   [AssociatedType(typeof(MyOtherChildClass))]
   MyOtherEnumValue
}

1 个答案:

答案 0 :(得分:1)

您无法使用Type执行此操作,并且您无法使用泛型,因为不允许使用泛型类扩展Attribute

您拥有的最佳解决方案是运行时检查,如果目标与预期目标不匹配,则忽略该属性。