【问题标题】:Specify Action<T> callback as data with xml, possibly with cref attribute?将 Action<T> 回调指定为带有 xml 的数据,可能带有 cref 属性?
【发布时间】: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 存储为字符串。不过,这似乎是一种非常迂回的方法。

感谢您的帮助!

【问题讨论】:

    标签: c# xml xml-parsing xmlreader


    【解决方案1】:

    您所描述的在技术上是可行的,但不可取。您可以使用反射来查找名为 CallbackClass 的类型,并使用名为 CallbackMethod 的方法。但它打开了蠕虫罐头。

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

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

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

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

    例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多