Casting string to generic type that is a string

Deadly 提交于 2019-12-18 05:59:08

问题


I'm writing a method to do a intelligent type conversion - using ToString() if the type parameter happens to be a string, otherwise casting but returning null if the cast doesn't work. Basically gets as much information out of v it can without throwing an exception.

I check that T is indeed a string before I attempt the cast, but the compiler is still not a fan:

Cannot convert type 'string' to 'T'

And here's my method:

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;
    }
}

Also let me know if this is some sort of unforgivable sin. I'm using it to deal with some data structures that could have mixed types.


回答1:


You basically need to go via object when casting to a generic type:

return (T)(object) v.ToString()

and

return (T)(object) v;

I would use is rather than catching an InvalidCastException though.

See Eric Lippert's recent blog post for more details of why this is necessary.

In particular:

Because the compiler knows that the only way this conversion could possibly succeed is if U is bool, but U can be anything! The compiler assumes that most of the time U is not going to be constructed with bool, and therefore this code is almost certainly an error, and the compiler is bringing that fact to your attention.

(Substitute T for U and string for bool...)




回答2:


You need to cast your string as object as your return type is generic i.e.

return (T)(object)v.ToString();



回答3:


Try to convert to object before converting to T

return (T)(object)v; 



回答4:


using System.ComponentModel;

...

public T Convert<T>(object v) {
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}

Warning, this will throw an exception if no conversion exists between T and the object contained in v.



来源:https://stackoverflow.com/questions/11866229/casting-string-to-generic-type-that-is-a-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!