我有一个方法,通过用户传递一些输入值,传递一个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)
等等
这可以整齐地完成吗?
詹姆士
好吧,如果你真的不想这样做
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)重载.