7

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

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

dynamic someObj = new SomeObject();

var methodName = "someMethodName";

// execute methodName on someObj

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

4

4 回答 4

7

您可以在任何对象上执行此操作,不一定是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()
于 2012-06-14T22:51:36.283 回答
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);
    }
}
于 2012-06-14T23:02:16.183 回答
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);
于 2015-09-15T08:30:02.507 回答
0

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

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

于 2012-06-14T22:55:34.210 回答