我有以下代码:
protected void Initialize(){
this.Fonts.Initialize();
this.Screens.Initialize();
this.Menu.Initialize();
}
protected void Update(){
this.Screens.Update();
this.Menu.Update();
}
写完这段代码后,我进行了重构:
protected void Initialize(){
this.CallMethod<INeedInitialization>(
(i) => { i.Initialize(); }
, this.Fonts, this.Screens, this.Menu
);
}
protected void Update(){
this.CallMethod<INeedUpdating>(
(i) => { i.Update(); }
, this.Screens, this.Menu
);
}
private void CallMethod<T>(Action<T> action, params T[] items){
items.ToList().ForEach(i => action(i));
}
然后,我意识到在我的代码库中,有很多重复使用 CallMethod<T>
类型的操作,所以我进一步进行了重构:
public static extensions{
// I use object type as I can have INeedInitialization, INeedUpdate etc...
public static void CallMethod<T>(this object obj, Action<T> action,
params T[] items){
items.ToList().ForEach(i => action(i));
}
}
现在,我可以在所有对象上获得
CallMethod<T>
,但是在这样做之后,我觉得代码存在一些根本性的问题,但是无法确定为什么感觉不正确。另外,如何对泛型方法进行OR约束,以仅接受
INeedUpdating
或INeedInitialize
类型的对象,而不是扩展基本的Object
类型?有人能帮忙吗?
谢谢!
IInitializable
和IUpdatable
。 - ChaosPandionForEach()
而将集合转换为列表是一种可憎的行为!如果想要使用,只需使用适当的循环或创建适当的扩展方法来隐藏它。 - Jeff Mercado