4

StackOverflow ユーザー jolson は、文字列を使用せずにメソッドを登録する方法を例示する非常に優れたコードを持っていましたが、式ツリーはこちら.

メソッドの代わりにプロパティに似たようなものを持つことは可能ですか? プロパティ (プロパティの名前ではない) を渡し、メソッド内でプロパティ名を取得するには?

このようなもの:


    RegisterMethod(p => p.Name)

    void RegisterMethod(Expression??? propertyExpression) where T : Property ???
    {
        string propName = propertyExpression.Name;
    }

ありがとう。

4

2 に答える 2

7

この完全な例をここthisに投稿しました (その下の " " に関する投稿も参照してください)。

などを扱っていることに注意してくださいLambdaExpression。投稿されたコードの更新として、いくつかのシナリオで使いやすくするためにもう少し追加できます。

static class MemberUtil<TType>
{
    public static string MemberName<TResult>(Expression<Func<TType, TResult>> member)
    {
        return MemberUtil.MemberName<TType, TResult>(member);
    }
}

次に、戻り値にジェネリック型推論を使用できます。

string test1 = MemberUtil<Foo>.MemberName(x => x.Bar); 
string test2 = MemberUtil<Foo>.MemberName(x => x.Bloop()); 
于 2008-11-13T09:45:15.420 に答える
6

これに沿って何かを書くことができます:

static void RegisterMethod<TSelf, TProp> (Expression<Func<TSelf, TProp>> expression)
{
    var member_expression = expression.Body as MemberExpression;
    if (member_expression == null)
        return;

    var member = member_expression.Member;
    if (member.MemberType != MemberTypes.Property)
        return;

    var property = member as PropertyInfo;
    var name = property.Name;

    // ...
}
于 2008-11-13T09:39:32.000 に答える