7

プロパティをパラメーターとして受け取り、そのゲッターを実行する関数を作成する必要があります。

関数/デリゲートを渡す必要がある場合は、次を使用します。

delegate RET FunctionDelegate<T, RET>(T t);

void func<T, RET>(FunctionDelegate function, T param, ...)
{
    ...
    return function.Invoke(param);
}

関数コードでゲッターやセッターを呼び出すことができるように、プロパティを定義する同様の方法はありますか?

4

5 に答える 5

11

次のように書くこともできます。

static void Method<T, U>(this T obj, Expression<Func<T, U>> property)
        {
            var memberExpression = property.Body as MemberExpression;
            //getter
            U code = (U)obj.GetType().GetProperty(memberExpression.Member.Name).GetValue(obj, null);
            //setter
            obj.GetType().GetProperty(memberExpression.Member.Name).SetValue(obj, code, null);
        }

および呼び出しの例:

DbComputerSet cs = new DbComputerSet();
cs.Method<DbComputerSet, string>(set => set.Code);
于 2010-11-09T10:08:07.350 に答える
9

リフレクションを使用して、get/set アクセサーの MethodInfo オブジェクトを取得し、その Invoke メソッドを呼び出すことができます。

コード例では、get アクセサーと set アクセサーの両方があることを前提としており、これを運用コードで使用する場合は、実際にエラー処理を追加する必要があります。

たとえば、オブジェクト obj のプロパティ Foo の値を取得するには、次のように記述できます。

value = obj.GetType().GetProperty("Foo").GetAccessors()[0].Invoke(obj,null);

設定するには:

obj.GetType().GetProperty("Foo").GetAccessors()[1].Invoke(obj,new object[]{value});

したがって、obj.GetType().GetProperty("Foo").GetAccessors()[0] をメソッドに渡して、Invoke メソッドを実行できます。

より簡単な方法は、匿名メソッドを使用することです (これは .net 2.0 以降で機能します)。コード例を少し変更したバージョンを使用しましょう。

delegate RET FunctionDelegate<T, RET>(T t);

void func<T, RET>(FunctionDelegate<T,RET> function, T param, ...)
{
    ...
    return function(param);
}

クラス SomeClass の一部である int 型の Foo という名前のプロパティの場合:

SomeClass obj = new SomeClass();
func<SomeClass,int>(delegate(SomeClass o){return o.Foo;},obj);
于 2008-09-21T09:22:02.537 に答える
3

プロパティは、メソッドのシンタックス シュガーにすぎません。

「ゲッターを呼び出すことができる」エンティティになるようにプロパティを変更できるとは思いません。

ただし、メソッド GetPropertyValue() を作成し、デリゲートのように渡すことができます。

于 2008-09-21T08:50:56.073 に答える
2

@ドロールヘルパー、

私はあなたがそのようにそれを行うことができないことを恐れています. Compiler は get_PropertyName および set_PropertyName メソッドを生成しますが、Reflection を使用しないとアクセスできません。IMO でできる最善のことは、System.Reflection.ProperyInfoSystem.Objectのパラメーターを取り、propInfo.GetValue(obj, null); を返す関数を作成することです。

于 2008-09-21T09:11:25.713 に答える
1

Re:akuさんの回答:

次に、そのプロパティ情報を最初に取得する必要があります。「リフレクションを使用する」というのは難しい C# の質問に対する標準的な回答のようですが、リフレクションは保守がそれほど難しくないコードを生成します。Dror、プロパティを読み取るデリゲートを作成してみませんか? これは単純なワンライナーであり、おそらく問題に対する最も迅速で美しい解決策です。

于 2008-09-21T09:32:34.337 に答える