使用AllowMultiple = false继承属性时出现意外行为

时间:2018-02-09 03:22:49

标签: c# .net inheritance reflection attributes

假设我有以下属性:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
class TestAttribute : Attribute { }

class FooAttribute : TestAttribute { }    
class BarAttribute : TestAttribute { }

我希望从TestAttribute继承的属性不能与方法重复:

[Foo][Bar] //I expect compile error here
void M() { } 

但实际上AllowMultiple检查仅应用于相同的属性类型,意味着[Test][Test][Foo][Foo][Bar][Bar]会发生编译错误,但{ {1}},[Test][Foo]

看起来像设计而不是bug?但是根据[Foo][Bar]的定义,某人很容易犯这样的错误:

TestAttribute

我的问题是:

Q1:他们为什么这样设计?我认为我的预期行为更“正确”?

Q2:有任何解决方法吗?我不想把Foo / Bar的东西放到枚举中并使用类似//bang! why? AllowMultiple=false! var testAttribute = someMethod.GetCustomAttribute<TestAttribute>(); //or someMethod.GetCustomAttributes<TestAttribute>().SingleOrDefault(); 的东西,因为继承的属性具有不同的属性,将它们放入一个属性很难维护。

0 个答案:

没有答案