C# 使用数据中的参数调用C方法

C# 使用数据中的参数调用C方法,c#,reflection,C#,Reflection,我有一个这样的XML字符串 <METHOD>foo</METHOD> <PARAM1>abc</PARAM1> <PARAM2>def</PARAM2> ... <PARAM99>ghi</PARAM99> <PARAM100>jkl</PARAM100> 对于我来说,有没有简单的方法可以将这个字符串映射到一个实际的方法调用,其中的参数与C中方法的参数名匹配?如果必须匹配构造

我有一个这样的XML字符串

<METHOD>foo</METHOD>
<PARAM1>abc</PARAM1>
<PARAM2>def</PARAM2>
...
<PARAM99>ghi</PARAM99>
<PARAM100>jkl</PARAM100>

对于我来说,有没有简单的方法可以将这个字符串映射到一个实际的方法调用,其中的参数与C中方法的参数名匹配?

如果必须匹配构造函数中的名称,请编辑。只需扔掉构造函数,因为它不是一个名称/值列表,而是一个必需的对象类型列表,并且名称不是必需的。使用属性在xml元素名称和类中的字段之间进行匹配。

假设您知道该类型,并拥有该类型的实例,并且该方法实际上是公共的:

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的调用提供一些绑定标志。

类似这样的内容如何:

    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());
    }
    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());
    }