我有一个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存储为字符串。不过,这似乎是一种非常迂回的方法。
谢谢您的帮助!
您所描述的在技术上是可行的,但是不可取。您可以使用反射来查找名为CallbackClass
的类型,其类型为CallbackMethod
。但它开辟了许多蠕虫。
static
?当您在代码中调用方法时,编译器会为您处理此问题。如果您尝试调用不存在的方法,则无法编译。如果尝试在不创建类实例的情况下调用实例方法,则无法编译。
如果你在代码之外存储方法和类的名称 - 用XML或其他任何东西 - 那么你就失去了安全网。您可以引用一种不存在的方法,或者由于多种原因而无法调用的方法。
更好的方法是允许应用程序根据它在XML文档中找到的内容确定它应该做什么,然后让应用程序决定应该调用哪些方法。
例如:
while(reader.Read()) {
switch(reader.Name) {
case "Callback":
callbackActions += SomeClass.SomeMethod;;
break;
}