我正在编写一个方法来进行智能类型转换 - 如果类型参数恰好是一个字符串,则使用ToString(),否则转换,但如果转换不起作用则返回null.基本上可以从中获取尽可能多的信息v而不会抛出异常.
我在尝试演员之前检查T确实是一个string,但编译器仍然不是粉丝:
Cannot convert type 'string' to 'T'
Run Code Online (Sandbox Code Playgroud)
这是我的方法:
public T? Convert<T>(object v)
{
if (typeof(T) == typeof(string)) {
return (T)v.ToString(); // Cannot convert type 'string' to 'T'
} else try {
return (T)v;
} catch (InvalidCastException) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
如果这是某种不可饶恕的罪,请告诉我.我用它来处理一些可能有混合类型的数据结构.
鉴于这个虚构的例子:
class NonGeneric
{
}
class Generic<T> : NonGeneric
where T : NonGeneric
{
T DoSomething()
{
return this; // **
}
}
Run Code Online (Sandbox Code Playgroud)
我期望它编译:Generic<T>派生自NonGeneric并且T必须是派生类,因此它满足其约束.
我应该能够做到这一点:
NonGeneric obj = new Generic<NonGeneric>();
Run Code Online (Sandbox Code Playgroud)
那么这个指令应该没有问题:
return this;
Run Code Online (Sandbox Code Playgroud)
或者至少这个:
return (T)this;
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用,上面的例子没有编译错误:
无法将类型转换
NonGeneric<T>为'T'
我做错了什么,我看不到它,或者只是不被允许?为什么这个?
如果可能的话,我会避免使用我在本文中描述的任何解决方法(反射,动态编译方法等).我也会避免使用dynamic对象(设计决定,我不能改变它).