说,我有一个像这样的XML字符串,
<METHOD>foo</METHOD>
<PARAM1>abc</PARAM1>
<PARAM2>def</PARAM2>
...
<PARAM99>ghi</PARAM99>
<PARAM100>jkl</PARAM100>
我有一个方法
void foo(String param1, String param2, ..., String param99, String param100)
{
...
}
有没有简单的方法让我将这个字符串映射到一个真正的方法调用,其中params匹配C#中方法的param名称?
答案 0 :(得分:8)
假设您知道类型,拥有它的实例,并且该方法实际上是公共的:
string methodName = parent.Element("METHOD").Value;
MethodInfo method = type.GetMethod(methodName);
object[] arguments = (from p in method.GetParameters()
let arg = element.Element(p.Name)
where arg != null
select (object) arg.Value).ToArray();
// We ignore extra parameters in the XML, but we need all the right
// ones from the method
if (arguments.Length != method.GetParameters().Length)
{
throw new ArgumentException("Parameters didn't match");
}
method.Invoke(instance, arguments);
请注意,我在这里进行区分大小写的名称匹配,这对您的示例无效。如果你想要不区分大小写,那就稍微困难了,但仍然可行 - 我个人建议你尽可能使XML与方法匹配。
(如果它是非公开的,你需要为调用GetMethod
提供一些绑定标志。)
答案 1 :(得分:2)
这样的事情怎么样:
public void Run(XmlElement rootElement)
{
Dictionary<string, string> xmlArgs = new Dictionary<string,string>(StringComparer.OrdinalIgnoreCase);
foreach( XmlElement elem in rootElement )
xmlArgs[elem.LocalName] = elem.InnerText;
MethodInfo mi = this.GetType().GetMethod(xmlArgs["METHOD"]);
List<object> args = new List<object>();
foreach (ParameterInfo pi in mi.GetParameters())
args.Add(xmlArgs[pi.Name]);
mi.Invoke(this, args.ToArray());
}
答案 2 :(得分:0)
编辑如果必须匹配构造函数中的名称。只需抛出构造函数,因为它不是名称/值的列表,而只是所需对象类型的列表,并且名称不是必需的。使用属性在xml元素名称和类中的字段之间进行匹配。