动态执行方法

本文关键字:方法 执行 动态 | 更新日期: 2023-09-27 18:37:20

我相信这个问题已经在某处得到了回答,但我在寻找正确的关键字组合来找到它时遇到了重大问题。

我很想知道是否有可能做这样的事情:

dynamic someObj = new SomeObject();
var methodName = "someMethodName";
// execute methodName on someObj

我基本上想知道是否可以使用存储方法名称的变量在动态对象上执行方法。

动态执行方法

您可以在任何对象上执行此操作,而不一定是使用反射dynamic对象。

object obj = new SomeObject();
var meth = obj.GetType().GetMethod("someMethodName");
meth.Invoke(obj, new object[0]); // assuming a no-arg method

使用 dynamic 时,可以使用任何标识符作为方法名,编译器不会抱怨:

dynamic obj = MakeSomeObject();
obj.someMethodName(); // Compiler takes it fine, even if MakeSomeObject returns an object that does not declare someMethodName()

好吧,你实际上不需要在引号中加上"someMethodName"。 您只需执行此操作(完整程序列表):

class Program
{
    static void Main(string[] args)
    {
        dynamic obj = new SomeObject();
        obj.someMethodName("hello");
    }
}
public class SomeObject
{
    public void someMethodName(string message)
    {
        Console.WriteLine(message);
    }
}

如果你的方法名称来自一些邪恶的地方,比如javascript或其他东西,那么你可以这样做:

class Program
{
    static void Main(string[] args)
    {
        dynamic obj = new SomeObject();
        var meth = obj.GetType().GetMethod("someMethodName");
        meth.Invoke(obj, new object[1]{"hello"});
    }
}
public class SomeObject
{
    public void someMethodName(string message)
    {
        Console.WriteLine(message);
    }
}

根据你的注释,要求能够使用字符串调用 SignalR 动态客户端代理的函数。尝试使用反射来执行此操作,即:.GetType().GetMethod(functionName)不起作用,因为它不适用于任何动态对象。

但是,可以使用动态对象的Invoke方法完成此操作。

var functionName = "alertAllUsers";
var message = "Hello!";
var groupID = "1";
var connection = GlobalHost.ConnectionManager.GetHubContext<SomeHub>();
connection.Clients.Group(groupID).Invoke(functionName, message);

您可以使用反射来做到这一点,请看这里:

http://en.csharp-online.net/CSharp_FAQ%3A_How_call_a_method_using_a_name_string