将 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 的方法。但它打开了蠕虫罐头。

是否需要创建 CallbackClass 的实例?如果有,是否有构造函数参数? 回调方法是static吗? 这个方法真的存在吗?

当您在代码中调用方法时,编译器会为您处理这些问题。如果您尝试调用不存在的方法,它将无法编译。如果您尝试调用实例方法而不创建类的实例,它将无法编译。

如果您将方法和类的名称存储在您的代码之外 - 在 XML 或几乎其他任何东西中 - 那么您将失去安全网。您可以引用一个不存在的方法,或者由于多种原因而无法调用的方法。

更好的方法是让您的应用程序根据它在 XML 文档中找到的内容来确定它应该做什么,然后让您的应用程序决定它应该调用哪些方法。

例如:

while(reader.Read()) 
    switch(reader.Name) 
        case "Callback":
        callbackActions += SomeClass.SomeMethod;;
        break;   
    

【讨论】:

以上是关于将 Action<T> 回调指定为带有 xml 的数据,可能带有 cref 属性?的主要内容,如果未能解决你的问题,请参考以下文章

SpringJDBC解析2-execute方法

C# Action<T;和 Func<T;委托

form表单提交action 如何接收

带有 std::function<double(std::vector<double>) 回调的 cppyy

ActionAction<T>Func<T>Predicate<T>

Action<T> 委托使用详解