指定操作 使用xml回调为数据,可能还有cref属性?

问题描述 投票:1回答:1

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

谢谢您的帮助!

c# xml xml-parsing xmlreader
1个回答
0
投票

您所描述的在技术上是可行的,但是不可取。您可以使用反射来查找名为CallbackClass的类型,其类型为CallbackMethod。但它开辟了许多蠕虫。

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

当您在代码中调用方法时,编译器会为您处理此问题。如果您尝试调用不存在的方法,则无法编译。如果尝试在不创建类实例的情况下调用实例方法,则无法编译。

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

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

例如:

while(reader.Read()) {
    switch(reader.Name) {
        case "Callback":
        callbackActions += SomeClass.SomeMethod;;
        break;   
    }
© www.soinside.com 2019 - 2024. All rights reserved.