我希望能够将一些操作描述为数据结构中表示的函数调用。然后我希望能够遍历数据结构并调用函数。
这个伪代码描述了我想要实现的目标:
static void Main(string[] args)
{
Action[] actions = new Action[]
{
new Action(DoAction1(5)),
new Action(DoAction1(7)),
new Action(DoAction2("100201")),
};
foreach (Action action in actions)
{
action.<Run the action function>;
}
}
public static void DoAction1(int x)
{
}
public static void DoAction2(string x)
{
}
看起来像是代表,但并不完全。
关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
这是你在找什么?
Action[] actions = new Action[]
{
new Action(()=>DoAction1(5)),
new Action(()=>DoAction1(7)),
new Action(()=>DoAction2("100201"))
};
foreach (Action action in actions)
{
action();
}
答案 1 :(得分:0)
.net中的Action类允许您直接分配lambdas
var actions = new List<Action>
{
() => DoAction1(5),
() => DoAction1(7),
() => DoAction2("100201"),
};
然后执行一系列操作可以像: -
actions.ForEach(a => a());
然后您可以向列表添加更多操作
actions.Add(() => DoAction2("blah blah"));
答案 2 :(得分:-1)
可能是你可以使用反射
var methodNames = typeof(MyType).GetMethods(BindingFlags.Public |
BindingFlags.Static)
.Select(x => x.Name)
.Distinct()
.OrderBy(x => x);
foreach (var property in yourObject.GetType().GetProperties())
{
if (property.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
{
foreach (var item in (IEnumerable)property.GetValue(yourObject, null))
{
//do stuff
}
}
}
答案 3 :(得分:-1)
由于您似乎不想使用Action类,因此可以查看SharpByte代码库,特别是SharpByte.Dynamic命名空间。它允许仅使用一个方法调用来评估语句和执行脚本,如下所示:
someContextObject.Execute("[executable code here]");
但是,您可以使用另一种方式,这可能是您正在寻找的方式。当您执行其中一个动态编译/执行扩展方法时,here's what's actually happening(释义):
IExecutable executable = ExecutableFactory.Default.GetExecutable(ExecutableType.Script, "[source code here]", optionalListOfParameterNames, optionalListOfNamespaces);
如果要评估表达式/函数而不是运行多行语句,则需要使用ExecutableType.Expression。重点是您可以在IExecutable对象周围保留一个引用,并根据需要多次运行它,每次都传递不同的参数值。您还可以使用每个的.Copy()方法自由复制IExecutable对象;它们被设计为线程安全但轻量级,因此可以将引用或副本放置在数据结构中以供进一步(重新)使用。 This post解释了一点。