C# 帮助我进行一些通用的转换

标签 c# generics casting

我正在尝试编写一种方法,将给定对象转换为给定类型的实例。我从这个开始:

private static T TryCast<T>(object o)
{
    return (T) o;
}

进去后,我知道不会起作用,但它说明了这个概念。现在,当我有不会自动转换的类型时,我将开始遇到问题,比如字符串 --> DateTime。我试图使用 Convert Class 来处理这些情况,但我只是得到一个编译时错误而不是运行时错误。以下代码得到编译错误“无法将类型为‘string’的表达式转换为类型‘T’

private static T TryCast<T>(object o)
{
    var typeName = typeof (T).FullName;

    switch (typeName)
    {
        case "System.String":
            return (T) Convert.ToString(o);
        default:
            return (T) o;
    }
}

我也知道 Convert.ChangeType(),但我想知道它是否会处理边缘情况,否则我会在上面的开关中处理,比如规定的字符串 --> DateTime,我通常只是将 Convert.ToDateTime 用于。

private static T TryCast<T>(object o)
{
    return (T)Convert.ChangeType(o, typeof(T));
}

那么,我最好的选择是什么?如果有人可以给我一个可行的方法,我可以从那里开始。

最佳答案

Convert.ChangeType 应该处理边缘情况;它委托(delegate)给 IConvertible

要回答这个问题,编译器不知道Tstring
因此,它不允许您在不相关的类型之间进行转换(就像您不能将 Button 转换为 TextBox 一样)。

您可以通过首先转换为 object 来解决这个问题:

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

现在,编译器允许每个单独的转换(它要么是直接向上转换,要么是直接向下转换),并且您知道整个事情都会起作用,因为 TString.

关于C# 帮助我进行一些通用的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9519723/

相关文章:

c# - .NET4.5下使用ArrayList进行转换

c# - 截断字符串并在第 n 个单词后添加单词

c# - 将 RowSplitter 与 UniformGrid 或其他东西一起使用以获得所需的结果

c# - 具有逆变类型参数和 Unity 容器的泛型

python - 如何参数化通用 Python 模块?

C 中的强制转换和赋值

c# - 如何手动验证具有属性的模型?

c# - 在 C# 中获取字节数组内容的 MD5 校验和

Swift 4 Codable 和泛型

C# 字节数组到固定 int 指针