如何在Action中使用可选参数?

时间:2011-06-23 18:42:48

标签: c# visual-studio visual-studio-2010 action params

我可能忽略了一些简单的事情,如何解决这个问题?

注意:编译器生成0错误但它不构建

    /**
     * The action (optional object[] is the params)
     */
    private Action<object[]> action;

    /**
     * Parameters
     */
    private object[] parameters;

    public virtual void runAction() //<- this is overridable
    {
        action(parameters);
    }

    public void setAction(Action action)
    {
        this.action<null> = action<null>;
    }

    public void setAction(Action action, params object[] parameters)
    {
        this.parameters = this.parameters;
        this.action<parameters> = action<parameters>;
    }

即使没有object[] parameters偶数,我也可以做到这一点。

我在这堂课外打电话给runAction。 List中有很多这样的类,我称之为runAction方法。我在demend上生成了这些类。这个类包含更多逻辑,然后就是你所看到的。

我要感谢谢谢你的支持。

4 个答案:

答案 0 :(得分:2)

我认为Action不支持可变数量的参数。我认为你可以做到:

public void RunAction(Action<object[]> action, params object[] parameters)
{
    action(parameters);
}

最终将被用于:

RunAction( x =>
  {
     Assert.AreEqual("Param1", x[0]);
     Assert.AreEqual("Param2", x[1]);
  },
  "Param1",
  "Param2");

或者我错过了你想要做的事情?

答案 1 :(得分:2)

this.action<parameters> = action<parameters>;

这是一团糟。 action不是泛型类型或泛型方法,因此这不提供泛型参数(无论如何,泛型参数是类型,而不是变量。实际上,您实际上使用的是less-than和greater-than关系运算符?但是parameters > ;没有比较任何东西。

编译器绝对不允许这种构建。看起来这就是你想要的:

private Action action;

public virtual void runAction()
{
    action();
}

public void setAction(Action action)
{
    this.action = action;
}

public void setAction(Action<object[]> action, params object[] parameters)
{
    this.action = delegate { action(parameters) };
}

我建议您阅读“关闭”。您可能会发现您正在编写的这门课程根本不是很有用。

答案 2 :(得分:0)

由于您使用的是VS 2010和.Net 4.0? ...尝试

public void setAction(Action action, object[] parameters = null)     
{
    this.parameters = this.parameters;    
    this.action<parameters> = action<parameters>;     
} 

您正在创建“可选”参数。

答案 3 :(得分:0)

如果您尝试使用可选参数,以便在不需要其他参数时可以进行更短的调用,而仅使用1-2个参数,则可以执行以下操作:

  1. 定义两个动作,一个动作接受第一个参数,而一个动作接受两个参数(例如):

    private readonly Action<EventType> _updateLog;
    
    private readonly Action<EventType, string> _updateLogWithDescription;
    
  2. 实例化动作后,只需为动作分配两个参数作为输入参数,然后在调用另一个动作并为其提供默认参数的基础上,使用一个参数计算动作,例如:

    public MyClass(Action<EventType, string> updateLogWithDescription)
    {
        _updateLogWithDescription = updateLogWithDescription;
        _updateLog = (EventType eventType) => updateLogWithDescription(eventType, string.Empty);
    }
    

然后,您只需要担心执行所有内部计算的1个源操作,然后在实际调用该类的类中,仅在需要时使用两个实例即可。

   _updateLog(EventType.MyEvent);
   _updateLogWithDescription(EventType.MyOtherEvent, $"My custom data {myvalue}");

我更喜欢使用此方法作为解决方案,因为我真的不喜欢object[]和强制转换。