【发布时间】:2020-08-19 11:15:11
【问题描述】:
我有以下两个功能:
private void CallVoidFunction(Action action, object property = null)
{
//Lots of code duplicated here
action.Invoke();
//and here between teh 2 methods
}
private void CallVoidFunction<T>(Action<T> action, object property = null)
{
//Lots of code duplicated here
action.Invoke((T)property);
//and here between teh 2 methods
}
有没有办法将这些组合成一个函数,该函数采用 Action 的通用属性?
否则我会有很多重复的代码。我知道我可以将重复的代码组合成函数并调用,但是可以吗?
Action 和 Action<T> 似乎不是从同一个基础派生的,所以我认为它不能完成?
我正在按照他们派生的接口的思路进行思考,但我看不出任何共同点?
我能想到的最好的方法如下,但我希望有一个更简单的方法。
public class ActionContainer<T>
{
public ActionContainer(Action<T> actionT, Action action, object property)
{
_actionT = actionT;
_action = action;
_property = property;
}
public void Invoke()
{
if (_property != null)
_actionT.Invoke((T)_property);
else
_action.Invoke();
}
private object _property { get; set; }
private Action<T> _actionT { get; set; }
private Action _action { get; set; }
}
【问题讨论】:
-
您可以将这两个中的第一个的主体简化为:
CallVoidFunction<int>(i => { action(); }, 0);然后您就不需要重复代码了。 -
@LasseV.Karlsen 你能发个例子吗
-
private void CallVoidFunction(Action action, object property = null) { CallVoidFunction<int>(i => { action(); }, 0); } -
为什么将
property声明为object然后转换为T? -
我认为 @Alex
CallVoidFunction<T>(Action<T> action, T property = null)和action.Invoke(property);在正文中应该也可以正常工作。
标签: c# generics delegates action