如何从数据结构中调用函数?

时间:2017-08-14 21:33:32

标签: c#

我希望能够将一些操作描述为数据结构中表示的函数调用。然后我希望能够遍历数据结构并调用函数。

这个伪代码描述了我想要实现的目标:

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)
{
}

看起来像是代表,但并不完全。

关于如何实现这一目标的任何想法?

4 个答案:

答案 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);

OR

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解释了一点。