如何制作Generic Type Cast功能

时间:2011-07-30 17:03:08

标签: c# .net generics

  

可能重复:
  is there a generic Parse() function that will convert a string to any type using parse?

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

ConvertValue<T>(string value)

如果Tint,则该函数会将值转换为int并返回结果。

同样,如果Tboolean,该函数会将value转换为boolean并将其返回。

如何写这个?

3 个答案:

答案 0 :(得分:177)

这样的东西?

public static T ConvertValue<T>(string value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}

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

int val = ConvertValue<int>("42");

修改

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

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

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

答案 1 :(得分: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)
    {}
}

答案 2 :(得分:-2)

ConvertValue(System.Object o),然后你可以通过o.GetType()结果分支出来并向上转换o来处理值。