特定数据类型的重载通用方法

Jam*_*hes 1 c#

我有一个方法,通过用户传递一些输入值,传递一个Func委托,返回新值(非常简化为我想要实现的)

    public L Coerce<L>(string value, Func<string, L> coercer)
    {
        return coercer(value);
    }

    Coerce<int>("123", v => int.Parse(v));
Run Code Online (Sandbox Code Playgroud)

这很好但是我也希望能够编写覆盖特定类型行为的方法,例如......

    public int Coerce<int>(string value)
    {
        return Coerce<int>(value, v => int.Parse(v));
    }
Run Code Online (Sandbox Code Playgroud)

所以基本上叫

    Coerce<int>("123"); // equivalent Coerce<int>("123", v => int.Parse(v));
Run Code Online (Sandbox Code Playgroud)

将节省我不得不为每个Coerce重写int.Parse.当然,这应该扩展到处理

    public decimal Coerce<decimal>(string value)
    {
        return Coerce<decimal>(value, v => int.Parse(v));
    }
Run Code Online (Sandbox Code Playgroud)

等等

这可以整齐地完成吗?

詹姆士

Mat*_*lls 6

好吧,如果你真的不想这样做

Convert.ToInt32(value)
Run Code Online (Sandbox Code Playgroud)

然后这将做你要求的:

public T Coerce<T>(string value) where T : IConvertible
{
    return (T)(((IConvertible)value).ToType(typeof(T),
       CultureInfo.InvariantCulture));
}
Run Code Online (Sandbox Code Playgroud)

因此:

int x = Coerce<int>("123");
Run Code Online (Sandbox Code Playgroud)

要么

byte b = Coerce<byte>("123");
Run Code Online (Sandbox Code Playgroud)

如果您尝试强制转换为不可转换类型,这将给您一个编译时错误,例如:

var x = Coerce<MyClass>("123"); //compile-time error
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您强制调用者使用您的Coerce(string value, Func<string,T> coercer)重载.