2

私はMSDNヘルプを検索するために尋ねられた古い質問を読んでいますが、特に配列リストをループする問題に関連して、PropertyInfoが何であるかを本当に理解できません

c#foreach(オブジェクトのプロパティ)...これを行う簡単な方法はありますか?)。

簡単な授業をしました

public MyClass
{
public double myProperty; // etc
}

次に、クラスオブジェクトをリストに追加します。リストをループして、各オブジェクトのプロパティだけを変更したい

foreach ( MyClass i in MyClassList)
{
foreach ( double myProperty in i.GetType().GetProperties() )
{
// do something
}


}

しかし、エラーが発生します。リンクされた質問(上記)では、'doubleの代わりにPropertyInfoを使用するように指示されています。myProperryの「double」を置き換える必要があるPropertyInfoとは何ですか?それは何を表しますか?

4

3 に答える 3

1

おそらくこれが必要です:

foreach (MyClass i in MyClassList)
{
    foreach (var myProperty in i.GetType().GetProperty("myProperty") )
    {
        myProperty.SetValue(i, 1.23);
    }
}

これは次と同等です。

foreach (MyClass i in MyClassList)
{
    i.myProperty = 1.23;
}
于 2012-11-01T13:22:54.013 に答える
1

PropertyInfoプロパティがその型に対して定義されているという事実を単に表します。オブジェクトごとではありません-タイプ用です。を取得するためにインスタンスは必要ありませんPropertyInfo

ただし、最初に、myProperty現在はプロパティではないことに注意してください。最初に修正しましょう。

public MyClass
{
    public double MyProperty {get;set;}
}

これで、「それが持っているすべてのプロパティ」について尋ねることで、そのプロパティについて知ることができます。

PropertyInfo[] props = typeof(MyClass).GetProperties();

または個々のプロパティ。おそらく実行時に構成から名前を取得します。

PropertyInfo prop = typeof(MyClass).GetProperty("MyProperty");

PropertyInfo名前、型、属性などを調べることができます - ライブラリコードに非常に役立ちます。ただし、通常のコードでは、静的 C# を使用するのが最も簡単なオプションです。

foreach(MyClass obj in MyClassList) {
    obj.MyProperty = 123.45;
}

リフレクションを介してこれを行う必要がある場合は、次を使用できますSetValue

foreach(MyClass obj in MyClassList) {
    prop.SetValue(obj, 123.45, null);
}    

ただし、より長い距離に行かない限り、反射は比較的遅くなります。たとえば、「実行時に名前を知る」シナリオを対象とする別の代替手段はFastMemberです。次に、次のことができます。

var accessor = TypeAccessor.Create(typeof(MyClass));
string propName = "MyProperty";
object value = 123.45;
foreach(MyClass obj in MyClassList) {
    accessor[obj, propName] = value;
}

これは、生のリフレクションよりもはるかに高速ですが、実行時にプロパティ名を見つけるという点で柔軟性があります。

于 2012-11-01T13:30:09.717 に答える
0

GetProperties は、PropertyInfo オブジェクトのコレクションを返します。

次に、必要なプロパティのコレクションを反復処理 (または検索) する必要があります。

GetProperties() の使用例については、こちらを参照してください

http://rhondatipton.net/2010/02/28/using-getproperties-in-c/

于 2012-11-01T13:22:05.883 に答える