如何使用可选的PARAMS的动作?

问题描述 投票:1回答:4

可能是一些简单的我忽略了我怎么解决这个问题?

注:编译器生成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类外。有很多类,如在此列出所有我叫runAction方法。我产生对demend这些类。这个类包含了一些更多的逻辑,那么就你所看到的。

让我知道感谢我很欣赏的支持。

c# visual-studio visual-studio-2010 action params
4个回答
2
投票
this.action<parameters> = action<parameters>;

这是一个烂摊子。 action不是泛型类型或泛型方法,所以这不是一个提供通用的参数(反正一般的参数类型,而不是变量。你实际上是在以某种方式使用小于和大于关系运算符?但是, 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
投票

我不认为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");

还是我缺少什么,你正在做什么?


0
投票

由于您使用VS 2010和.NET 4.0? ...尝试

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

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


0
投票

如果你想使用一个可选的参数,这样你可以有一个更短的电话时,你不需要额外的参数,而你只是一个工作 - 2参数,你可以做到以下几点:

  1. 定义两个操作,一个接受的第一个参数,和一个接受两个参数(例如): private readonly Action<EventType> _updateLog; private readonly Action<EventType, string> _updateLogWithDescription;
  2. 一旦你实例化的动作,只是用指定两个参数作为输入参数的作用,并计算基于调用其他行动,并给予它的默认参数,e.g一个参数的作用: 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[]和铸造。

© www.soinside.com 2019 - 2024. All rights reserved.