簡體   English   中英

使用數據中的參數調用C#方法

[英]Calling C# method with parameters from data

說,我有一個像這樣的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名稱?

假設您知道類型,擁有它的實例,並且該方法實際上是公共的:

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

編輯如果必須匹配構造函數中的名稱。 只需拋出構造函數,因為它不是名稱/值的列表,而只是所需對象類型的列表,並且名稱不是必需的。 使用屬性在xml元素名稱和類中的字段之間進行匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM