在属性中键入约束

时间:2014-10-23 05:09:26

标签: c# .net generics reflection custom-attributes

我想用自定义属性编写枚举,例如:

public enum SomeEnum: long
{
    [SomeAttribute<MyClass1>]
    Sms = 1,
    [SomeAttribute<MyClass2>]
    Email = 2
}

但属性不支持泛型。嗯,最类似的解决方案是:

public enum SomeEnum: long
{
    [SomeAttribute(typeof(MyClass1))]
    Sms = 1,
    [SomeAttribute(typeof(MyClass2))]
    Email = 2
}

问题在于:我希望Class1继承自ICustomInterface,所以使用泛型我可以编写约束:

[AttributeUsage(AttributeTargets.All)]
class SomeAttribute<T> : Attribute where T: ICustomInterface
{
}

但属性不支持泛型。

所以最后的问题是:如何检查该类型正在实现某个接口的编译时间(如T约束)?

2 个答案:

答案 0 :(得分:7)

最后一个问题非常简单:

  

所以最后的问题是:如何检查编译时间(如T   约束)那种类型正在实现一些接口?

你做不到。

但你可以在运行时检查它,使用一些反射方法,如: Type.IsAssignableFrom

答案 1 :(得分:0)

虽然我遇到了类似的问题,但你还是没有得到编译时检查。

现在这个:

public class SomeAttribute : Attribute
{
    public SomeAttribute(Type given)
    {
        Given = given;
        Required = typeof (INotifyDataErrorInfo);
    }

    public Type Given { get; set; }
    public Type Required { get; set; }

    public bool Valid()
    {
        return Required.IsAssignableFrom(Given);
    }
}

public enum TestEnum 
{
    [Some(typeof(string))]
    Sms = 1,
    [Some(typeof(string))]
    Email = 2
}

你可能会感到悲伤。

虽然我记得,如果你使用PostSharp,有一种方法可以调用代码相关的编译时间检查,如果这是你之后的事情。这可能不会在您的IDE中直观地指出缺陷,但它仍然确保其他开发人员必须确保传递某种类型。