可能是一些简单的我忽略了我怎么解决这个问题?
注:编译器生成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这些类。这个类包含了一些更多的逻辑,那么就你所看到的。
让我知道感谢我很欣赏的支持。
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) };
}
我建议你阅读“倒闭潮”。你可能会发现,这个类你写的不是非常有用的。
我不认为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");
还是我缺少什么,你正在做什么?
由于您使用VS 2010和.NET 4.0? ...尝试
public void setAction(Action action, object[] parameters = null)
{
this.parameters = this.parameters;
this.action<parameters> = action<parameters>;
}
您正在创建一个“可选”的参数。
如果你想使用一个可选的参数,这样你可以有一个更短的电话时,你不需要额外的参数,而你只是一个工作 - 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[]
和铸造。