指定Action <t>回调作为带有xml的数据,可能带有cref属性?

时间:2019-03-07 21:07:05

标签: c# xml xml-parsing xmlreader

我有一个xml定义文件,我要为一个对象指定的属性之一是回调。似乎可以使用cref属性指定回调,但是我不知道如何将其解析为方法或Action。像这样:

<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存储为字符串。不过,这似乎是一种非常round回的方法。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您所描述的内容在技术上是可行的,但不建议这样做。您可以使用反射使用名为CallbackClass的方法来找到名为CallbackMethod的类型。但是它打开了蠕虫的罐头。

  • 是否需要创建CallbackClass的实例?如果是这样,它是否具有构造函数参数?
  • 是CallbackMethod static吗?
  • 该方法是否存在?

当您在代码中调用方法时,编译器会为您处理这些事情。如果您尝试调用一个不存在的方法,它将无法编译。如果您尝试在不创建类实例的情况下调用实例方法,则它将无法编译。

如果将方法和类的名称存储在代码之外(以XML或几乎所有其他形式存储),则将失去该安全网。您可以引用一个不存在的方法,或者由于多种原因而无法调用的方法。

一种更好的方法是允许您的应用程序根据在XML文档中找到的内容确定应该执行的操作,然后让您的应用程序确定应调用的方法。

例如:

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