簡単なテストをしましょう:
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);
結果には、使用設定に関係なく、4 つの属性が含まれます。そのため、開発者は継承属性の使用設定を無視することができます。