このリンクからこの回答を見ました カスタム属性へのパラメーターの追加 カスタム属性にパラメーターを追加する方法
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に変更しました。また、私はそれをプライベートにし、それを試してみたときにうまく動作します。
受け入れられた回答が有効である理由を誰かに教えてもらえますか?
受け入れられた回答は、プライベートフィールドの代わりにパブリックプロパティを使用します。パブリックプロパティの利点は、コンストラクタを省略して、デフォルトコンストラクタでプロパティの値を提供できることです。
最初のコード、つまりパブリックプロパティを持つコードをこのようなものに変更します。
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
}
[MyCustomAttribute(Values = new int[] { 3, 4, 5 })]
class MyClass { }
[MyCustomAttribute(3, 4, 5)]
の場合、パラメーターリストには名前がないため、MyCustomAttribute
のコンストラクターが使用されます。
したがって、パブリックValues
プロパティが存在する場合、それは重要ではありません。
最初のコードサンプルでは、[MyCustomAttribute(3, 4, 5)]
および[MyCustom(Values = new[] {3, 4, 5})]
を使用できます。
2番目のコードサンプル「のみ」は、[MyCustomAttribute(3, 4, 5)]
を受け入れます。
違いがあり、それはすべてreflection
についてです。
主なものは、取得する流さです。コンストラクタまたはValues
プロパティを使用できます。
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");