web-dev-qa-db-ja.com

C#-静的クラスから静的プロパティの値を取得する

コンボボックスに値を入力するために、単純な静的クラスのいくつかの静的プロパティをループ処理しようとしていますが、問題があります。

ここに単純なクラスがあります:

public static MyStaticClass()
{
    public static string property1 = "NumberOne";
    public static string property2 = "NumberTwo";
    public static string property3 = "NumberThree";
}

...そして値を取得しようとするコード:

Type myType = typeof(MyStaticClass);
PropertyInfo[] properties = myType.GetProperties(
       BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
foreach (PropertyInfo property in properties)
{
    MyComboBox.Items.Add(property.GetValue(myType, null).ToString());
}

バインディングフラグを指定しない場合、System.Reflection.Module Moduleなどの約57のプロパティと、気にしない他のあらゆる種類の継承されたものを取得します。私の3つの宣言されたプロパティは存在しません。

他のフラグのさまざまな組み合わせを指定すると、常に0のプロパティが返されます。すごい。

私の静的クラスが実際に別の非静的クラス内で宣言されていることは重要ですか?

何が悪いのですか?

41
JamesW

問題は、_property1..3_がプロパティではなくフィールドであることです。

それらをプロパティにするには、次のように変更します。

_private static string _property1 = "NumberOne";
public static string property1
{
  get { return _property1; }
  set { _property1 = value; }
}
_

または、自動プロパティを使用して、クラスの静的コンストラクターでそれらの値を初期化します。

_public static string property1 { get; set; }

static MyStaticClass()
{
  property1 = "NumberOne";
}
_

...または、フィールドが使用したい場合はmyType.GetFields(...)を使用します。

54
M4N

MSDNによれば、BindingFlags.DeclaredOnlyを削除してみてください。

指定された型の階層のレベルで宣言されたメンバーのみを考慮する必要があることを指定します。継承されたメンバーは考慮されません。

Staticは継承できないため、これが問題の原因となっている可能性があります。また、取得しようとしているフィールドがプロパティではないことにも気付きました。だから使用してみてください

type.GetFields(...)
6
Nick Berardi