调用作为参数传递的方法作为参数传递的对象

时间:2015-09-22 13:31:42

标签: c# reflection func

我有一个类定义了几个具有相同签名的函数

public class MyClass
{
    public string MyParam1() ...
    public string MyParam2() ...
    ...
}

从另一个类我想调用一个作为参数传递的方法作为参数传递给参数

void MyFunction(MyClass anObject, Func<string> aMethod)
{
    string val = ??? // Here call aMethod on anObject
}

我很确定使用反射可以做到这一点,但有不难做到这一点吗?

实际上我有一组对象,而不是单个对象,这就是为什么我不能直接调用对象的方法。

3 个答案:

答案 0 :(得分:3)

如果您将实例方法作为函数传递,它已经绑定到实例,那么在这种情况下您的anObject就没用了。

此代码已在this上运行:

MyFunction(null, this.DoSomething);

此处val始终是调用者上下文中this.DoSomething的结果:

string val = aMethod();

您可以做的不是传递实例方法,而是创建一个具有anObject参数的静态方法。通过这种方式,您的静态方法可以执行特定于实例的任务。

public string MyParam2(MyClass instance) { }

void MyFunction(MyClass anObject, Func<MyClass, string> aMethod)
{
    string val = aMethod(anObject);
}

答案 1 :(得分:0)

您不必担心anObject aMethod 已绑定到实例。代表的定义是它是reference to an instance of a method

因此,以下内容就足够了:

void MyFunction(Func<string> aMethod)
{
    string val = aMethod();
}

答案 2 :(得分:0)

如果你真的想在一个对象上调用一个给定的方法,那么不要使用Func,而是传入对象和方法的名称:

class Test
{
    public static void SayHello()
    {
        Console.WriteLine("Hello");
    }
}

void Main()
{
    var t = new Test();
    var methodInfo = t.GetType().GetMethod("SayHello");
    methodInfo.Invoke(t, null);

}

执行时,将打印

Hello

因为它会调用SayHello实例Test上的t方法。