【问题标题】:Array containing Methods包含方法的数组
【发布时间】:2011-12-04 10:58:27
【问题描述】:

我想知道您是否可以创建包含方法的数组或列表。我不想使用 switch 或大量 if 语句。

谢谢

【问题讨论】:

标签: c# arrays methods


【解决方案1】:

是的,可以有这样的数组或列表。根据输入或输出参数的数量,您可以使用类似

List<Func<T1, T2, TReturn>>

Func&lt;T1, T2, TReturn&gt; 类型的实例是类似的方法

TReturn MyFunction(T1 input1, T2 input2)

Take a look at the MSDN.

【讨论】:

    【解决方案2】:

    给你

    List<Action> list = new List<Action>();
    list.Add( () => ClassA.MethodX(paramM) );
    list.Add( () => ClassB.MethodY(paramN, ...) );
    
    foreach (Action a in list) {
        a.Invoke();
    }
    

    【讨论】:

    • 为什么Invoke() 在这里?你就不能a()吗?
    • @Vilx- 是的,您可以使用a()。而且您不需要为此使用沉重的List&lt;T&gt;。你可以做new Action[] { ()=&gt; MyMethod(), ()=&gt; MyMethod2() };
    • 用ListT解释你的意思
    【解决方案3】:

    如果你不想使用列表,也许你想试试这个

    public    Action[] methods;
    
    private void methodsInArray()
    {
    
        methods= new Action[2];
        methods[0] = test ;
        methods[1] = test1;
    }
    
    private void test()
    {
        //your code
    }
    
    private void test1()
    {
        //your code
    }
    

    【讨论】:

      【解决方案4】:

      如果您尝试替换开关,那么字典可能比列表更有用

      var methods = new Dictionary<string, Action>()
                    {
                        {"method1", () => method1() },
                        {"method2", () => method2() }
                    };
      
      methods["method2"]();
      

      我认为这和 switch 语句是一种代码味道,它们通常可以是 replaced by polymorphism。

      【讨论】:

      • 这取决于你想在哪里使用它。如果您尝试实现命令模式怎么办?在这种情况下完全没问题。 (也最好使用列表)
      • 为什么使用列表更好?
      • 由于使用命令模式,您通常希望循环遍历回调
      • 感谢您说这是一种气味。仅仅因为你可以做某事,并不意味着你应该这样做。
      猜你喜欢
      • 1970-01-01
      • 2012-01-24
      • 2014-01-31
      • 2015-01-06
      • 1970-01-01
      • 2017-02-17
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多