我想用自定义属性编写枚举,例如:
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
约束)?
答案 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中直观地指出缺陷,但它仍然确保其他开发人员必须确保传递某种类型。