-1

私は単純なクラスを持っています:

class Test
{
    public static int Test<T>(T arg)
    {
        return 1;
    }
}

Delegateこのメソッドを表す型のオブジェクトを取得したいと思います。そのような代理人を作成することは可能ですか? 任意の数のパラメーターとジェネリック引数を持つメソッドをDelegate.

4

4 に答える 4

2

ここではデリゲートを使用したくありません。MethodInfoインスタンスが必要です:

void ImportMethod(string name, MethodInfo method)

次のように呼び出します。

void ImportMethod("Test", typeof(Test).GetMethod("Test", ...Static));
于 2013-04-04T14:16:29.377 に答える
1

タイプ セーフを維持するためにジェネリックを使用してメソッドを作成する場合は、異なる量の入力パラメーターを持つメソッドごとに 2 つのメソッドを作成する必要があります。1 つは void メソッド (Action) 用で、もう 1 つは値を返すメソッド (Func) 用です。メソッドのインポートごとに渡す必要がある一般的なパラメーターの数を削減するため、ヘルパー クラスを追加しました。メソッドを呼び出すときの IntelliSense にも役立ちます。

    public class Foo
    {
        public void Bar()
        {
        }

        public void Bar(string input)
        {
        }

        public bool BarReturn()
        {
            return false;
        }
    }

    public class ImportHelper<TClass>
    {
        public void Import(string name, Expression<Action<TClass>> methodExpression)
        {
            ImportMethod(name, methodExpression);
        }

        public void ImportMethodWithParam<TParam>(string name, Expression<Action<TClass, TParam>> methodExpression)
        {
            ImportMethod<TClass, TParam>(name, methodExpression);
        }

        public void ImportMethodWithResult<TResult>(string name, Expression<Func<TClass, TResult>> methodExpression)
        {
            ImportMethod<TClass, TResult>(name, methodExpression);
        }
    }

    private static void TestImport()
    {
        ImportMethod<Foo>("MyMethod", f => f.Bar());
        ImportMethod<Foo, string>("MyMethod1", (f, p) => f.Bar(p));
        ImportMethod<Foo, bool>("MyMethod2", f => f.BarReturn());

        var helper = new ImportHelper<Foo>();
        helper.Import("MyMethod", f => f.Bar());
        helper.ImportMethodWithParam<string>("MyMethod1", (f, p) => f.Bar(p));
        helper.ImportMethodWithResult("MyMethod2", f => f.BarReturn());
    }

    public static void ImportMethod<TClass>(string name, Expression<Action<TClass>> methodExpression)
    {
        var method = GetMethodInfo(methodExpression.Body as MethodCallExpression);
        //Do what you want with the method.
    }

    public static void ImportMethod<TClass, TParam>(string name, Expression<Action<TClass, TParam>> methodExpression)
    {
        var method = GetMethodInfo(methodExpression.Body as MethodCallExpression);
        //Do what you want with the method.
    }

    public static void ImportMethod<TClass, TResult>(string name, Expression<Func<TClass, TResult>> methodExpression)
    {
        var method = GetMethodInfo(methodExpression.Body as MethodCallExpression);
        //Do what you want with the method.
    }

    private static MethodInfo GetMethodInfo(MethodCallExpression methodCallExpression)
    {
        if (methodCallExpression == null)
            return null;

        return methodCallExpression.Method;
    }
于 2013-04-11T19:53:43.297 に答える
0

FuncActionが探しているもののようです。

次を使用して「デリゲートオブジェクト」を取得できます

Func<int> func = () => Test<Foo>(bar);

あなたが使用することができます

void ImportMethod(string name, Action action)

また

void ImportMethod(string name, Func<int> func)

戻り値が必要かどうかに応じて、このように登録します

ImportMethod("Name", () => Test<Foo>(bar))
于 2013-04-04T14:13:31.093 に答える
0
public delegate int Del<T>(T item);
于 2013-04-04T14:14:16.470 に答える