让我们做一个简短的测试:
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Reflection;
namespace TestAttrs {
public abstract class BaseAttribute : Attribute {
public string text;
}
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MultipleInheritedAttribute : BaseAttribute { }
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class MultipleNonInheritedAttribute : BaseAttribute { }
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class SingleInheritedAttribute : BaseAttribute { }
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class SingleNonInheritedAttribute : BaseAttribute { }
public class BaseClass {
[MultipleInherited(text = "MultipleInheritedBase")]
[MultipleNonInherited(text = "MultipleNonInheritedBase")]
[SingleInherited(text = "SingleInheritedBase")]
[SingleNonInherited(text = "SingleNonInheritedBase")]
public virtual void Method() { ; }
}
public class DerivedClass : BaseClass {
[MultipleInherited(text = "MultipleInheritedDerived")]
[MultipleNonInherited(text = "MultipleNonInheritedDerived")]
[SingleInherited(text = "SingleInheritedDerived")]
[SingleNonInherited(text = "SingleNonInheritedDerived")]
public override void Method() {
base.Method();
}
}
[TestClass]
public class AttributesTest {
[TestMethod]
public void TestAttributes() {
MemberInfo mi = typeof(DerivedClass).GetMember("Method")[0];
object[] attrs = mi.GetCustomAttributes(true);
string log = "";
foreach(BaseAttribute attr in attrs) {
log += attr.text+"|";
}
Assert.AreEqual("MultipleInheritedDerived|SingleInheritedDerived|SingleNonInheritedDerived|MultipleNonInheritedDerived|MultipleInheritedBase|", log);
}
}
}
如您所见,如果属性被标记,Inherted=true
那么它将为派生类返回,但如果继承的方法被标记为相同的属性 - 如果AllowMultiple=false
. 所以 - 在我们的测试中,日志字符串包含“MultipleInheritedDerived”和“MultipleInheritedBase”,但不包含“SingleInheritedBase”。
所以回答你的问题 - 有什么意义?这种组合允许您拥有一个带有虚拟方法的基本控制器,您可以覆盖它而不用担心属性(它将从基本方法中获取),但同时如果您愿意也可以覆盖它。HttpPostAttribute 不是一个很好的例子,因为它没有参数,但其他属性可以从这样的设置中受益。
另外,请注意代码消耗属性:
object[] attrs = mi.GetCustomAttributes(true);
指定它对继承的属性感兴趣。如果写
object[] attrs = mi.GetCustomAttributes(false);
那么 result 将包含 4 个属性,无论它们的使用设置如何。因此开发人员可以忽略继承属性使用设置。