6

オブジェクトのいくつかのプロパティの名前と値を出力するメソッドがあるとします。

public void PrintProperties(object o, params string[] propertyNames)
{
    foreach (var propertyName in propertyNames)
    {
        // get the property info,
        // then get the property's value,
        // print property-name and -value
    }
}
// method can be used like this
PrintProperties(user, "FirstName", "LastName", "Email");

文字列のリストをメソッドに渡す代わりに、ラムダ式を使用してプロパティを指定できるようにメソッドを変更したいと思います (それが正しい用語かどうかはわかりません)。

たとえば、次のように (何らかの方法で) メソッドを呼び出すことができるようにしたいと考えています。

PrintProperties(user, u->u.FirstName, u->u.LastName, u->u.Email);

目標は、メソッドのユーザーにインテリセンス サポートを提供し、入力エラーを防ぐことです。( のような ASP.NET MVC ヘルパー メソッドに似ていますTextBoxFor(u=>u.Name))。

メソッドを定義するにはどうすればよいPropertyInfoですか? また、メソッド内で s を取得するにはどうすればよいですか?

4

2 に答える 2

8

次のような宣言を使用します。

void PrintProperties<T>(T obj,
                        params Expression<Func<T, object>>[] propertySelectors)
{
   ...
}

次のように呼び出し可能:

PrintProperties(user, u => u.FirstName, u => u.LastName, u => u.Email);

各ラムダからプロパティ名を取得する方法については、ラムダ式からプロパティ名を取得する を参照してください。プロパティが値型の場合、その回答で提供されているものよりも少し深くする必要がある場合があることに注意してくださいint(この場合、コンパイラは、Convert必要なメンバーアクセスに対して単項式を生成します) 、構造体をボックス化するため)。

于 2013-05-02T15:35:56.800 に答える
1

Reflection を使用すると、フィールド、プロパティ、イベントなどにアクセスできます。

public void PrintProperties(object o, params string[] propertyNames)
{
    foreach (var propertyName in propertyNames)
    {
        // Dont have VS now, but it's something like that
        Console.WriteLine(o.GetType().GetProperty(propertyName).GetValue(o, null));
    }
}

私は今VSを持っていないので、コンパイルさえしないかもしれませんが、これらの名前に沿って、オートコンプリートとうまくやっていくことができます...

于 2013-05-02T15:36:37.730 に答える