繁体   English   中英

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

[英]Call a method passed as parameter on an object passed as parameter

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

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

从另一个类,我想在作为参数传递的对象上调用作为参数传递的方法

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

我很确定可以使用反射来做到这一点,但是有没有困难的方法呢?

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

如果将实例方法作为函数传递,则该方法已绑定到该实例 ,因此在这种情况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);
}

您无需担心anObject因为aMethod 已绑定到实例 委托的定义是对方法实例引用

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

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

如果您真的想在对象上调用给定的方法,请不要使用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

因为它将在Test实例t上调用SayHello方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM