我正在为特定的匹配条件编写文本文件解析器,并且在一些文件中我需要进行一些自定义操作。我想要做的是将外部XML文件中使用的自定义过程的名称与其他规则一起存储。大多数人都不会使用这个,我找到了关于动作调用的答案:
以上具有以下字典定义
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语句作为默认值吗?
答案 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");
答案 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();