将 Action<T> 回调指定为带有 xml 的数据,可能带有 cref 属性?
Posted
技术标签:
【中文标题】将 Action<T> 回调指定为带有 xml 的数据,可能带有 cref 属性?【英文标题】:Specify Action<T> callback as data with xml, possibly with cref attribute? 【发布时间】:2019-07-29 20:54:12 【问题描述】:我有一个 xml 定义文件,我想为对象指定的属性之一是回调。我似乎可以使用 cref 属性指定回调,但我不知道如何将其解析为方法或操作。像这样的:
<XML>
<ClassData>
<Callback cref="CallbackClass.CallbackMethod"/>
</ClassData>
</XML>
然后解析它(在 C# 中):
Action callbackActions;
XmlReader reader; // I'm skipping w/e code gets the xml text into the reader
while(reader.Read())
switch(reader.Name)
case "Callback":
Action callback = ??? // How do I parse the cref attribute as an Action here?
callbackActions += callback;
break;
或者还有其他方法可以实现相同的目标吗?
我在某处看到了一些相关的讨论,它可能与反射有关,将 CallbackClass 和 CallbackMethod 存储为字符串。不过,这似乎是一种非常迂回的方法。
感谢您的帮助!
【问题讨论】:
【参考方案1】:您所描述的在技术上是可行的,但不可取。您可以使用反射来查找名为 CallbackClass
的类型,并使用名为 CallbackMethod
的方法。但它打开了蠕虫罐头。
static
吗?
这个方法真的存在吗?
当您在代码中调用方法时,编译器会为您处理这些问题。如果您尝试调用不存在的方法,它将无法编译。如果您尝试调用实例方法而不创建类的实例,它将无法编译。
如果您将方法和类的名称存储在您的代码之外 - 在 XML 或几乎其他任何东西中 - 那么您将失去安全网。您可以引用一个不存在的方法,或者由于多种原因而无法调用的方法。
更好的方法是让您的应用程序根据它在 XML 文档中找到的内容来确定它应该做什么,然后让您的应用程序决定它应该调用哪些方法。
例如:
while(reader.Read())
switch(reader.Name)
case "Callback":
callbackActions += SomeClass.SomeMethod;;
break;
【讨论】:
以上是关于将 Action<T> 回调指定为带有 xml 的数据,可能带有 cref 属性?的主要内容,如果未能解决你的问题,请参考以下文章
带有 std::function<double(std::vector<double>) 回调的 cppyy