0

次のシグネチャを持つメソッドがあるとします。

public void MyMethod(Func<int> expression)
{
    // Does work
}

そして、このメソッドを次のように呼び出します。

int intProperty = 7;
MyMethod(() => intProperty);

ラムダを使用せずにこのメソッドを呼び出す方法はありますか? だから私はそれを次のようにしたい:

MyMethod(intProperty);

メソッドのシグネチャを変更する必要があるかどうかは、私にとっては問題ではありません - 私はそれを頼りにしています。私がこれをやろうとしている理由は、アクセスできるようにする必要がある関数として渡されたときに、初期プロパティに関する追加情報を調べることができるからです。

元のパラメーターに関する情報が必要なため、MyMethod 内で Reflection を使用してもここで機能するとは思いません。それらは、関数から名前などの情報を取得する方法であり、これを取得できるようにしたいと考えています。私はすでにこれを行うことができます。したがって、上記の例では、MyMethod は、渡されたプロパティの名前が intProperty であると判断できます。

注: これは単純化された例です。それが私が望んでいたすべてである場合、私は私がプロパティを渡すことができることをよく知っています。しかし、元の名前など、Func がここでキャプチャしている元のプロパティに関する追加情報が必要です。

4

2 に答える 2

1

プロパティに対してはできませんが、プロパティのような getter メソッドに対しては実行できます。C#3.0 以降では、メソッド groupsを使用して暗黙的にデリゲートを構築できます。

public void MyMethod(Func<int> expression) {
    // Does work
}
public int GetProperty() {
    return 123;
}
pubic void Test() {
    MyMethod(GetProperty /* NO PARENTHESES HERE!!! */);
}

メソッド名の後の括弧を削除すると、呼び出し式がメソッド グループに変換されます。残念ながら、これは、プロパティへのアクセスに括弧が必要ないため、プロパティに匹敵する構文がないことを意味します。

于 2013-03-08T13:58:52.847 に答える
0

式の使用

メソッドのシグネチャを変更する必要があるかどうかは問題ではないとおっしゃいました。それでは、メソッドのシグネチャを次のように変更してみませんか。

public void MyMethod<T>(T source, Expression<Func<T, int>> expression)
{
    // Evaluate expression
}

MyMethod(this, x => x.property);

ここでは、式ツリーの解析について詳しくは説明しませんが、詳細については、SO に関する次の質問を参照してください。

ラムダ式からプロパティ名を取得する

リフレクションの使用

リフレクションを使用して、プロパティに関する情報を取得することもできます。sourceプロパティの実際の値を取得する必要がない場合は、パラメーターを削除します。

public void MyMethod(object source, string propertyName)
{
    var pi = source.GetType().GetProperty(propertyName);
    if (pi == null)
    {
        throw new Exception("property not found");
    }

    MyMethod(source, pi);
}

public void MyMethod(object source, PropertyInfo property)
{
    // Evaluate property
}

MyMethod(this, "Property");
于 2013-03-08T13:55:28.783 に答える