变量作为外部XML文件的函数调用

时间:2014-05-22 18:52:03

标签: c# xml

我正在为特定的匹配条件编写文本文件解析器,并且在一些文件中我需要进行一些自定义操作。我想要做的是将外部XML文件中使用的自定义过程的名称与其他规则一起存储。大多数人都不会使用这个,我找到了关于动作调用的答案:

Variable for function names

以上具有以下字典定义

private static readonly IDictionary<string,Action<string>> actionByType =
    new Dictionary<string,Action<string>> 

从我当前程序中的XML文件添加元素(将添加这两个元素)

foreach (XmlNode node in nodes)
            {
                Client holding = new Client();

                holding.has_custom = 
                     Convert.ToBoolean(
                      node.SelectSingleNode("has_custom").InnerText);
                holding.custom_call = 
                     node.SelectSingleNode("custom_call").InnerText;

                clients.Add(holding);
            }

当我详细说明时,如何将自定义调用的名称指定为要在字典中调用的操作?然后我使用带有通用解析的case语句作为默认值吗?

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确,但您可以分配动作/功能(代表更具体),如下所示:

actionByType.Add("write", text => Console.WriteLine(text));
actionByType.Add("write2", Console.WriteLine);

或者像这样:

void someAction(string someString)
{
     Console.WriteLine(someString);
}

...
actionByType.Add("write", someAction);

然后像这样调用:

actionByType["write"]("Hello World!");

所以在你的情况下,它将是:

actionByType[holding.custom_call]("What ever you need that string argument for");

这是小提琴https://dotnetfiddle.net/oFuEeF

答案 1 :(得分:0)

首先,使用反射获得正确的MethodInfo。这应该是一个静态方法,并且应该驻留在包含所有XML可访问方法的静态类中。

var method = typeof(MyStoredTypes).GetMethod(methodName, BindingFlags.Public | BindingFlags.Static)

您还需要ParameterExpression来捕获传入的字符串。

var param = Expression.Parameter(typeof(string));

最后,System.Linq.Expression.Call为您的通话创建表达式树,Lambda,以及Compile

var act = Expression.Lambda<Action<string>>(
    Expression.Call(param, method),
    new ParameterExpression[] { param })
.Compile();
相关问题