Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#帮我做一些普通的演员表演_C#_Generics_Casting - Fatal编程技术网

C#帮我做一些普通的演员表演

C#帮我做一些普通的演员表演,c#,generics,casting,C#,Generics,Casting,我正在尝试编写一个方法,用于将给定对象转换为给定类型的实例。我从这个开始: private static T TryCast<T>(object o) { return (T) o; } private static T TryCast(对象o) { 返回(T)o; } 我知道这是行不通的,但它说明了这个概念。现在,当我有无法自动强制转换的类型时,我将开始遇到问题,比如字符串-->日期时间。我试图使用Convert类来处理这些情况,但我只得到了一个编译时错误,而不是运行时

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

private static T TryCast<T>(object o)
{
    return (T) o;
}
private static T TryCast(对象o)
{
返回(T)o;
}
我知道这是行不通的,但它说明了这个概念。现在,当我有无法自动强制转换的类型时,我将开始遇到问题,比如字符串-->日期时间。我试图使用Convert类来处理这些情况,但我只得到了一个编译时错误,而不是运行时错误。以下代码获取编译错误“无法将'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;
    }
}
private static T TryCast(对象o)
{
var typeName=typeof(T).FullName;
开关(类型名称)
{
案例“System.String”:
返回(T)转换为字符串(o);
违约:
返回(T)o;
}
}
我也知道Convert.ChangeType(),但我想知道它是否能处理我在上述开关中处理的边缘情况,比如我通常只使用Convert.ToDateTime处理的指定字符串-->DateTime

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

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

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

为了回答这个问题,编译器不知道
t
string

因此,它不允许您在不相关的类型之间进行强制转换(就像您不能将
按钮
强制转换为
文本框

您可以通过首先强制转换到
对象来解决此问题:

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

现在,编译器允许每个单独的转换(可以是直接向上转换,也可以是直接向下转换),并且您知道整个过程都会起作用,因为
T
String

好的,为了提供一点上下文,此方法的直接用法是根据DataRow对象中的列值在T类型的实例上动态分配属性DatRow上的名称。我已经编写了反射,以从类型中获取PropertyInfo并设置实例值。此铸造位是我的最后一块拼图。我希望它尽可能可重用,但如果将您的范围限制在我的示例中会更容易,那么就这样吧。我知道上面的第二个示例应该生成compiler错误,以及原因。我只是用它来说明方法,谢谢。不是那么新鲜:我为什么没想到这个?让我们看看其他人怎么说,但这可能是公认的答案。