假设我们有一个具有这样签名的泛型方法:
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)
{
...
}
}
这当然像一个工厂方法,必须调用特定的实现提供者,但仍然需要类型检查。
对于这种情况,您建议最好的(希望是通用的方法)是什么?
为什么使用泛型方法?
我决定有一个泛型方法,所以它总是返回正确的类型,而不需要在调用代码中强制转换方法返回。
正如您所说,您必须对某些描述执行类型检查。然而,你可以很容易地把它分解成更小的方法,甚至有一个开放的注册方案:
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?
}