如何在动作中使用可选参数?

问题描述

| 可能是一些简单的事情我忽略了如何解决? 注意:编译器会产生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>;
    }
也许即使没有without1,我也有办法做到这一点。 我在这堂课之外叫
runAction
。 List all我称之为
runAction
方法有很多这样的类。我按需生成这些类。此类包含的逻辑比您看到的还要多。 让我知道,谢谢我的支持。     

解决方法

        
this.action<parameters> = action<parameters>;
真是一团糟。 “ 5”不是泛型类型或泛型方法,因此它没有提供泛型参数(无论如何,泛型参数是类型,而不是变量。实际上,您在某种程度上使用了小于和大于关系运算符?但是ѭ6不会比较任何东西。 编译器绝对正确,不要让它生成。看来这就是您想要的:
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) };
}
我建议您阅读有关\“ closures \”的内容。您可能会发现您正在编写的此类根本不是很有用。     ,        我不认为ѭ8支持可变数量的参数。我认为您可以这样做:
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\");
还是我在尝试做的事情中缺少某些东西?     ,        由于您使用的是VS 2010和.Net 4.0? ...尝试
public void setAction(Action action,object[] parameters = null)     
{
    this.parameters = this.parameters;    
    this.action<parameters> = action<parameters>;     
} 
您正在创建一个\'optional \'参数。     ,        如果您尝试使用可选参数,以便在不需要附加参数时可以进行更短的调用,而您只使用1-2个参数,则可以执行以下操作: 定义两个动作,一个动作接受第一个参数,另一个动作接受两个参数(例如):
private readonly Action<EventType> _updateLog;

private readonly Action<EventType,string> _updateLogWithDescription;
实例化操作后,只需为该操作分配两个参数作为输入参数,并在调用另一个操作并为其提供默认参数的基础上,使用一个参数计算该操作,例如:
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[]
和铸造。