我可能忽略了一些简单的事情,如何解决这个问题?
注意:编译器生成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上生成了这些类。这个类包含更多逻辑,然后就是你所看到的。
我要感谢谢谢你的支持。
答案 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个参数,则可以执行以下操作:>
定义两个动作,一个动作接受第一个参数,而一个动作接受两个参数(例如):
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[]
和强制转换。