セージ の メモ書き

メモこそ命の恩人だ

C# - AttributeUsage 属性 (カスタム属性)

AttributeUsage 属性 (カスタム属性)

https://docs.microsoft.com/ja-jp/dotnet/standard/attributes/writing-custom-attributes

https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/attributes/creating-custom-attributes

  • 属性を自作できる。
  • 定義方法
    • クラスを定義。名称は "***Attribute" の形式。 ※1
    • Attribute クラスを継承する。
    • AttributeUsage 属性を付与する。※2
    • カスタム属性のプロパティを定義する。
  • ※1 使用方法
    • 使用する際は、*** の部分を指定する。
  • ※2 詳細情報
    • AttributeTargets:属性を付与する対象(Class, Field など)
    • Inherited:継承後、属性を引き継ぐか否か
    • AllowMultiple:複数の属性指定を許可するか否か

こんな感じ。

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class SampleAttribute : Attribute
{
    public int Info1 { get; }
    public string Info2 { get; }
    public bool Info3 { get; }

    public SampleAttribute(int info1, string info2, bool info3)
    {
        Info1 = info1;
        Info2 = info2;
        Info3 = info3;
    }
}
[Sample(1, "aaa", true)]
public class SampleClass
{

}
private void Button_Click(object sender, RoutedEventArgs e)
{
    var value = new SampleClass();

    var attribute = value.GetType()
        .GetCustomAttributes(typeof(SampleAttribute), false)
        .Cast<SampleAttribute>()
        .FirstOrDefault();

    Debug.WriteLine(attribute.Info1);
    // 1
    Debug.WriteLine(attribute.Info2);
    // "aaa"
    Debug.WriteLine(attribute.Info3);
    // True
}

使用例

多言語対応

[AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)]
public class JapaneseAttribute : Attribute
{
    public string Word { get; }
    public JapaneseAttribute(string word) => Word = word;
}

[AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)]
public class EnglishAttribute : Attribute
{
    public string Word { get; }
    public EnglishAttribute(string word) => Word = word;
}
public enum SampleEnum
{
    [English("Sample1")]
    [Japanese("サンプル1")]
    Sample1,

    [English("Sample2")]
    [Japanese("サンプル2")]
    Sample2,

    [English("Sample3")]
    [Japanese("サンプル3")]
    Sample3,
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    // 以下、属性の文字列を取得できたことを確認。

    var info1 = SampleEnum.Sample1;
    Debug.WriteLine(info1.ToEnglish());
    Debug.WriteLine(info1.ToJapanese());

    var info2 = SampleEnum.Sample2;
    Debug.WriteLine(info2.ToEnglish());
    Debug.WriteLine(info2.ToJapanese());

    var info3 = SampleEnum.Sample3;
    Debug.WriteLine(info3.ToEnglish());
    Debug.WriteLine(info3.ToJapanese());
}



以上