如何制作Generic Type Cast功能

Riz*_*Riz 66 .net c# generics

可能重复:
是否有一个通用的Parse()函数,它将使用parse将字符串转换为任何类型?

我想做一些通用函数来做一些操作,比如:

ConvertValue<T>(string value)
Run Code Online (Sandbox Code Playgroud)

如果T是,int则函数将值转换为int并返回结果.

同样,如果Tboolean,函数将转换valueboolean并返回它.

怎么写这个?

Bro*_*ass 187

像这样的东西?

public static T ConvertValue<T>(string value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

int val = ConvertValue<int>("42");
Run Code Online (Sandbox Code Playgroud)

编辑:

您甚至可以更通用地执行此操作,而不依赖于string类型U实现的参数IConvertible- 这意味着您必须指定两个类型参数:

public static T ConvertValue<T,U>(U value) where U : IConvertible
{
    return (T)Convert.ChangeType(value, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

我考虑过捕捉InvalidCastException可能引起的异常Convert.ChangeType()- 但在这种情况下你会得到什么?default(T)?让调用者处理异常似乎更合适.

  • 不要忘记,这不会为值类型处理null,例如,`ConvertValue <int>(null)`爆炸不像`Convert.ToInt32(null)`将返回0.这可能是可取的,但是有点差异尽管如此,请记住.另一个微妙的区别是,由于`Convert.ChangeType(new object(),typeof(object))`返回对象本身,即使`System.Object`不是`IConvertible`,也不严格需要约束`IConvertible`,即,如果输入和输出类型相同,那么`IConvertible` -ity无关紧要. (5认同)
  • 做得很好.但只是一个使用说明:不要忘记为不支持的转换实现异常处理. (3认同)
  • @Evan:看看我的更新 - 我认为调用者应该处理这个异常,因为在转换方法中没有好办法处理它 - 返回`default(T)`对我来说听起来不对. (3认同)

Bra*_*AGr 9

虽然可能不像方法那样干净IConvertible,但您总是可以使用简单的检查typeof(T)来返回T:

public static T ReturnType<T>(string stringValue)
{
    if (typeof(T) == typeof(int))
        return (T)(object)1;
    else if (typeof(T) == typeof(FooBar))
        return (T)(object)new FooBar(stringValue);
    else
        return default(T);
}

public class FooBar
{
    public FooBar(string something)
    {}
}
Run Code Online (Sandbox Code Playgroud)

  • 当您需要特定类型的专用逻辑时,此技术非常有用 (2认同)