用于存储函数指针和参数值的函数列表

时间:2015-03-26 20:31:44

标签: c# func

我想存储一个带有参数值的函数列表,以及稍后我在列表中添加函数时。我想按照我添加的顺序执行所有操作。

例如,我想使用func而不是action,并且不想在调用参数函数时创建匿名函数:

动态函数列表类,用于保存函数列表并稍后执行。

class DynamicFunctionList
{
    public List<Action> DynamicList = new List<Action>();
    public void Execute()
    {
        foreach (var obj in DynamicList)
        {
           obj();
        }
    }

}

一些有功能的课程

public class SomeClass
{
    public void PrintHello()
    {
       Console.Write("Hello");

    }

    public void PrintBye()
    {
        Console.Write("Print Bye");
    }

    public int GetPrinterValue()
    {
        return 2;
    }

    public int Add(int a, int b)
    {
        return (a + b);
    }
}

这就是你将如何使用它

public static void MainClass()
    {
        var first = 0;
        var second = 0;
        var dfList = new DynamicFunctionList();
        var sClass = new SomeClass();
        dfList.DynamicList.Add(() => first = sClass.GetPrinterValue()); // problem line
        dfList.DynamicList.Add(sClass.PrintBye);
        dfList.DynamicList.Add(sClass.PrintHello);
        dfList.DynamicList.Add(() => second = sClass.Add(2, 3)); // problem
        dfList.Execute();
    }

1 个答案:

答案 0 :(得分:-1)

我这样做:

    public void main()
    {
        List<MethodInvoker> methods = new List<MethodInvoker>();
        methods.Add(new MethodInvoker(SomeMethod));

        foreach (var method in methods)
        {
            method.Invoke();
        }
    }

    public void SomeMethod()
    {
        //... do something
    }

编辑1:

您可以使用System.Reflection命名空间中的MethodBase.Invoke(更多信息:https://msdn.microsoft.com/en-us/library/a89hcwhh%28v=vs.110%29.aspx

你可以这样做:

public class DynamicMethod
{        
     public string ClassName { get; set; }

     public string MethodName { get; set; }

     public object[] Parameters { get; set; }

     public static object InvokeMethod(DynamicMethod methodInfo)
     {
         var magicType = Type.GetType(methodInfo.ClassName);
         var magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
         var magicInstance = magicConstructor.Invoke(new object[] {});

         var magicMethod = magicType.GetMethod(methodInfo.MethodName);
         return magicMethod.Invoke(magicInstance, methodInfo.Parameters);
     }
}

public class Example
{
    public static void main()
    {
        var d1 = new DynamicMethod
        {
            ClassName = "SomeClass",
            MethodName = "Add",
            Parameters = new object[] { 1, 2 }
        };

        var returnedValue = DynamicMethod.InvokeMethod(d1);   
        Console.WriteLine(returnedValue.ToString());
    }

此外,您可以向此类添加更多信息,例如存储返回类型以进行正确转换的某种方式。