动态执行方法

时间:2012-06-14 22:49:20

标签: c# c#-4.0 dynamic invoke

我确信这个问题已在某个地方得到解答,但我在找到合适的关键字组合时遇到了重大问题。

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

dynamic someObj = new SomeObject();

var methodName = "someMethodName";

// execute methodName on someObj

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

4 个答案:

答案 0 :(得分:7)

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

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()

答案 1 :(得分:2)

好吧,你实际上在引号中不需要“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);
    }
}

答案 2 :(得分:2)

根据您的意见,要求是能够使用字符串调用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);

答案 3 :(得分:0)