假设我们有一个带有这种签名的通用方法:
T Obfuscate<T>(T value) where T : IConvertible
我将类型约束设置为IConvertible
,因此此方法可以消化简单的值类型以及字符串。让我们忘记一下,也可以提供枚举......
我想避免这样的实现,它会检查实际的参数类型以执行正确的处理。
// Please no GOD METHODS
public T Obfuscate<T>(T value)
where T : IConvertible
{
if (value is int)
{
...
}
if (value is string)
{
...
}
}
这肯定有一种工厂方法的味道,它必须调用特定的实现提供程序,但仍然需要进行类型检查。
您认为这种情况最好(希望是通用方法)是什么?
我决定使用泛型方法,因此它总是返回正确的类型,而不需要在调用代码时强制转换方法。
答案 0 :(得分:4)
正如您所说,您必须对某些描述进行类型检查。但是,您可以轻松地将其分解为更小的方法,甚至可以使用开放式注册方案:
private readonly Dictionary<Type, Delegate> obfuscators =
new Dictionary<Type, Delegate>;
// Alternatively, register appropriate obfuscators on construction.
public void RegisterConverter<T>(Func<T, T> obfuscator)
{
obfuscators[typeof(T)] = obfuscator;
}
public T Obfuscate<T>(T value)
{
Delegate obfuscator;
if (obfuscators.TryGetValue(typeof(T), out obfuscator)
{
// We know it'll be the right type...
var realObfuscator = (Func<T, T>) obfuscator;
return realObfuscator(value);
}
// ??? Throw exception? Return the original value?
}