我有以下代码:
public class Class1 { void ValueSpecific(string arg) { // do string stuff } void ValueSpecific(int arg) { // do int stuff } void ValueSpecific(float arg) { // do float stuff } void ValueGeneric(string arg) { // do stuff ValueSpecific(arg); // do more stuff } void ValueGeneric(int arg) { // do stuff ValueSpecific(arg); // do more stuff } void ValueGeneric(float arg) { // do stuff ValueSpecific(arg); // do more stuff } void Main(string s, int i, float f) { ValueGeneric(s); ValueGeneric(i); ValueGeneric(f); } }
这有效,但ValueGeneric的所有三个重载的机身都是相同的.我想将它们合并为一种方法,它看起来像:
void ValueGeneric<T>(T arg) where T: string, float, int { // do stuff ValueSpecific(arg); // do more stuff }
但是,这当然不是有效的C#.
我能想到的最好的是:void ValueGeneric(object arg) { // Do stuff if (arg is int) { ValueSpecific((int)arg); } else if (arg is string) { ValueSpecific((string)arg); } else if (arg is float) { ValueSpecific((float)arg); } else { Debug.Assert(false, "Invalid type) } // Do more stuff }
但这似乎非常不优雅.我很感激任何建议. (虽然我会对任何解决方案感兴趣,但.NET3.5支持的解决方案最好,因为我正在使用它.)
假设你在所有重载之前和之后都做了相同的事情,你可以应用通常的方法来分解代码中的不同之处并对它们进行参数化.唯一改变的是传入的参数以及您对该参数执行的操作.将它们都传递进去.static void ValueGeneric<T>(T arg, Action<T> action) { // do stuff action(arg); // do more stuff }
然后使用适当的操作调用泛型方法(您的ValueSpecific重载将很好地解决自己).
ValueGeneric(s, ValueSpecific); ValueGeneric(i, ValueSpecific); ValueGeneric(f, ValueSpecific);
精彩评论