我有以下代码:
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
类型?
有人可以帮忙吗?
谢谢!
最佳答案
这似乎是花式编码综合症的一个例子。我看不到从一般例程中获得任何好处,而且在维护、调试和测试的额外代码上花费了大量费用。
关于C#编码模式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6317505/