web-dev-qa-db-ja.com

C#カスタム属性パラメーター

このリンクからこの回答を見ました カスタム属性へのパラメーターの追加 カスタム属性にパラメーターを追加する方法

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(params int[] values) {
       this.Values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }

今、私はそれがこのように書くことができないのだろうかと思っていますか?

class MyCustomAttribute : Attribute {
    private int[] _values;

    public MyCustomAttribute(params int[] values) {
       _values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }

プロパティの値を変数_valuesに変更しました。また、私はそれをプライベートにし、それを試してみたときにうまく動作します。

受け入れられた回答が有効である理由を誰かに教えてもらえますか?

9
user5002462

受け入れられた回答は、プライベートフィールドの代わりにパブリックプロパティを使用します。パブリックプロパティの利点は、コンストラクタを省略して、デフォルトコンストラクタでプロパティの値を提供できることです。

最初のコード、つまりパブリックプロパティを持つコードをこのようなものに変更します。

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }
}

[MyCustomAttribute(Values = new int[] { 3, 4, 5 })]
class MyClass { }
9
Han

[MyCustomAttribute(3, 4, 5)]の場合、パラメーターリストには名前がないため、MyCustomAttributeのコンストラクターが使用されます。

したがって、パブリックValuesプロパティが存在する場合、それは重要ではありません。

最初のコードサンプルでは、​​[MyCustomAttribute(3, 4, 5)]および[MyCustom(Values = new[] {3, 4, 5})]を使用できます。

2番目のコードサンプル「のみ」は、[MyCustomAttribute(3, 4, 5)]を受け入れます。

4
Ralf Bönning

違いがあり、それはすべてreflectionについてです。

主なものは、取得する流さです。コンストラクタまたはValuesプロパティを使用できます。

enter image description here

public class MyCustomAttribute : Attribute
{
    public int[] Values { get; set; } = new int[] { 1, 2, 3 };

    public MyCustomAttribute(params int[] values)
    {
        this.Values = values;
    }
}

[MyCustom(1, 2, 3)]
class MyClass
{

}

[MyCustom(Values = new int[] { 1, 2, 3})]
public class MyAnotherClass
{
}

もう1つの要素は、プロパティを取得するreflectionです。 Valuesフィールドがpublicの場合、以下を使用して詳細を取得できますが、privateを使用することはできません。

var data = typeof(MyCustomAttribute).GetProperty("Values");
3
Lijo Joseph