我在视图中有一些操作。
public class AView
{
public Action Show { get; set; }
public Action Hide { get; set; }
}
并且我试图通过将它们作为参数传递来设置其他类中的动作(我不想传递整个类)
_reloader.SetupActions(Show, Hide);
Reloader
是抽象的,因为根据我们所处的场景,可能会有不同的方式来处理“隐藏/显示”的行为方式。
public abstract class Reloader : IReloader
{
public void SetupActions(Action show, Action hide)
{
show = Show;
hide = Hide;
}
protected virtual void Show() { ... } //what should be done when Show is invoked
protected virtual void Hide() { ... } //same for Hiding
}
对于当前视图,我可能正在使用RapidReloader
,SafeReloader
等。该位无关紧要,只是注入的重新加载器特定于当前视图。
现在我的问题很简单且逻辑合理:当我进入SetupActions
时,所有参数均为空(因为尚未设置操作),并且显然将Show
设置为null
不起作用。
我该怎么办,以便当Show.Invoke()出现在我的视图中时,从相关的重新加载器中调用ShowCode?我想避免将整个视图作为参数传递。
此外,如果您有更好的设计,我会全力以赴。我们可能处于XY problem情况下
答案 0 :(得分:1)
如果您不使用.Net Framework 4.7或更高版本,则需要使用System.ValueTuple
nuget程序包。
public interface IReloader
{
(Action Show, Action Hide) GetActions();
}
public abstract class Reloader : IReloader
{
public (Action Show, Action Hide) GetActions()
{
return (Show, Hide);
}
protected virtual void Show() { }
protected virtual void Hide() { }
}
public class FastReloader : Reloader { }
public class AView
{
public Action Show{ get; set; }
public Action Hide{ get; set; }
public void IwantTheNewActions()
{
var reloader = new FastReloader();
var actions = reloader.GetActions();
Show = actions.Show;
Hide = actions.Hide;
}
}