属性中的类型约束

问题描述 投票:0回答:3

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

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
约束)?

c# .net generics reflection custom-attributes
3个回答
8
投票

你的最后一个问题非常简单:

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

你不能那样做。

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


1
投票

虽然我也遇到过类似的问题,但你不会得到编译时间检查。

现在这个:

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 中的缺陷,但它仍然确保其他开发人员必须确保传递某种类型。


0
投票
class SomeAttribute<T> : Attribute where T: ICustomInterface
{
}

从 C#11 开始你就可以这样做。

© www.soinside.com 2019 - 2024. All rights reserved.