【发布时间】:2013-04-18 18:41:43
【问题描述】:
我想知道是否可以通过字符串调用动态 c# 对象上的函数。我想做这样的事情:
string lMethodName = "MethodName";
dynamic lDynamicObject = GetDynamicObject();
lDynamicObject.Invoke(lMethodName, lParameters);
任何想法或解决方案将不胜感激。
也许就像 Servy 所说的,有更好的方法可以通过不同的设计来实现我们想要的。我们正在使用 SignalR 并有一个仪表板 Web 应用程序。我们希望仪表板中的每个小部件都能够将数据推送到它。为了实现这一点,我们将使用剃须刀代码将小部件 ID 注入到每个单独的小部件 SignalR 客户端代理中。每个小部件都有以下内容:
hub.client.updateWidget123456 = aUpdateFunction;
其中 123456 是小部件的 ID。在服务器端 SignalR 集线器代码中,我们可以回调客户端 javascript 函数:
int lWidgetId = 123456;
dynamic lDynamic = Clients.All;
lDynamic.Invoke("updateWidget" + lWidgetId, lParameters);
在不创建 javascript 代理方法的情况下,我可以想到其他方法来实现这一点。我认为这很好,因为服务器与每个单独的小部件都有直接的通信线路。可以从多个仪表板/浏览器访问它们,但它们都将通过上面的单个调用得到更新。
我们可以通过在我们的 javascript 客户端代码中调用其他对象来实现这一点,这些对象知道所有小部件以及如何将信息定向到它们。我觉得这违背了 SignalR 的集线器架构,就像我们这样做是在重新发明轮子。
有人对更好的设计方法有任何想法吗?感谢您的帮助,感谢您的评论 Servy 引发了这次讨论。
另外,这个问题不是重复的。另一个问题与 Paul 在下面评论的动态对象无关。
【问题讨论】:
-
不,这个问题是针对动态类型的,另一个问题是针对一般反射的。
-
你几乎肯定不想这样做。你应该强烈考虑重新设计你的代码,这样你就不需要这样做了。
-
这个问题根本不是重复的,因为这里提到的另一个问题没有解决动态问题。这是关于静态类型和反射的,@Paul 已经对此发表了评论。
-
确实 IF 您使用反射并没有什么不同,但是 OP 以及将来可能会发现这个问题的一些人正在尝试做一些“动态”的事情,并出于某种原因决定动态关键字可能是答案。显式反射只是一种类型的解决方案,并且解释确切的区别是什么,这是公认的答案是有用的。链接问题比动态关键字的引入早了一年多,该关键字首次出现在 VS2010 中。