我想用自定义属性编写枚举,例如:
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
约束)?
你的最后一个问题非常简单:
最后的问题是:我如何检查编译时间(比如 T 约束)该类型正在实现某些接口?
你不能那样做。
但是你可以在运行时检查它,使用一些反射方法,例如: Type.IsAssignableFrom
虽然我也遇到过类似的问题,但你不会得到编译时间检查。
现在这个:
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 中的缺陷,但它仍然确保其他开发人员必须确保传递某种类型。
class SomeAttribute<T> : Attribute where T: ICustomInterface
{
}
从 C#11 开始你就可以这样做。