【问题标题】:How to make a Generic Type Cast function [duplicate]如何制作通用类型转换函数[重复]
【发布时间】:2011-07-30 17:03:07
【问题描述】:

可能重复:
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 并返回。

这个怎么写?

【问题讨论】:

标签: c# .net generics


【解决方案1】:

这样的?

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

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

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

编辑:

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

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

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

【讨论】:

  • 做得很好。不过,只是一个使用说明:不要忘记对不支持的转换实施异常处理。
  • @Evan:查看我的更新 - 我认为调用者应该处理这个异常,因为在转换方法中没有很好的方法来处理它 - 返回 default(T) 对我来说是错误的。
  • @BrokenGlass:我同意。在辅助方法中没有干净的方法来处理它。如果我使用它,我会在呼叫周围加上 try-catch 块。
  • 不要忘记,这不会处理值类型的 null,例如,ConvertValue&lt;int&gt;(null) 与将返回 0 的 Convert.ToInt32(null) 不同,它会爆炸。这可能是可取的,但在行为上还是有细微差别,请记住。另一个细微的区别是,限制到IConvertible 并不是严格需要的,因为Convert.ChangeType(new object(), typeof(object)) 返回对象本身,即使System.Object 不是IConvertible,即如果输入和输出类型相同,则IConvertible -ity 无关紧要。
  • 我同意@BrokenGlass 的观点,ConvertValue 应该处理异常。但是,我相信您可以并且应该拥有一个确实处理异常并返回default(T)TryConvertValueInt.TryParse)。
【解决方案2】:

虽然看起来可能不像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)
    {}
}

【讨论】:

  • 当您需要特定类型的专用逻辑时,此技术很有用
【解决方案3】:

ConvertValue(System.Object o),然后您可以通过 o.GetType() 结果进行分支并将 o 向上转换为使用该值的类型。

【讨论】:

  • OP 特别要求使用泛型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多