我有一个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回的方法。
谢谢您的帮助!
答案 0 :(得分:0)
您所描述的内容在技术上是可行的,但不建议这样做。您可以使用反射使用名为CallbackClass
的方法来找到名为CallbackMethod
的类型。但是它打开了蠕虫的罐头。
static
吗? 当您在代码中调用方法时,编译器会为您处理这些事情。如果您尝试调用一个不存在的方法,它将无法编译。如果您尝试在不创建类实例的情况下调用实例方法,则它将无法编译。
如果将方法和类的名称存储在代码之外(以XML或几乎所有其他形式存储),则将失去该安全网。您可以引用一个不存在的方法,或者由于多种原因而无法调用的方法。
一种更好的方法是允许您的应用程序根据在XML文档中找到的内容确定应该执行的操作,然后让您的应用程序确定应调用的方法。
例如:
while(reader.Read()) {
switch(reader.Name) {
case "Callback":
callbackActions += SomeClass.SomeMethod;;
break;
}