以类型通用/不可知方式实现泛型方法的最佳方法

时间:2014-05-30 14:30:02

标签: c# generics factory-method

假设我们有一个带有这种签名的通用方法:

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)
    {
        ...
    }
}

这肯定有一种工厂方法的味道,它必须调用特定的实现提供程序,但仍然需要进行类型检查。

您认为这种情况最好(希望是通用方法)是什么?

为什么是通用方法?

我决定使用泛型方法,因此它总是返回正确的类型,而不需要在调用代码时强制转换方法。

1 个答案:

答案 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?
}