匿名类型的C#类型强制转换异常,为什么?

Troskyvs

我有一个非常简单的代码段:

    public static object ParseData(string s)
    {
        string[] array = s.Split(' ');
        return new { Name = array[0], Address = array[1], Postcode = array[2] };
    }

    static T Cast<T>(object obj, T type)
    {
        return (T)obj;//throws exception!
    }
    public static void Main(string[] args)
    {
        string s = "john, 20st, 100020";
        var o = Cast(ParseData(s), new { Name="", Address="", PostCode="" });
    }

运行时,它将打印异常信息:

Unhandled Exception: System.InvalidCastException: 
Unable to cast object of type 
'<>f__AnonymousType0`3[System.String,System.String,System.String]'
to type
'<>f__AnonymousType1`3[System.String,System.String,System.String]'.

at ConsoleApp1.Program.Cast[T](Object obj, T type) 

为什么会这样,如何修复我的代码?

伊恩·罗伯逊

类型不是具体的。它们现在是相同的形状,但这是一个巧合。在为具体类建立数据时,我尝试仅将匿名类型用作中介步骤,并且匿名类型很少离开单个方法的范围。

匿名类型很难测试,难以传递,而且正如您所发现的那样,很难转换。

有时我会使用匿名类型从Web api方法返回数据,因此在将响应序列化为JSON时赋予其特定的形状。但是,使用者通常将是JS客户端,并且不依赖于C#类型(匿名或具体)将JSON反序列化为对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试将 C# 匿名类型转换为强类型

为什么C#允许将匿名对象分配给类类型的类字段?

为什么不能在C#中创建匿名类型的列表<T>?

为什么这种Haskell类型的强制转换不会编译?

为什么需要在Typescript中键入强制类型转换?

为什么在将其强制转换为void *类型之前需要复制Objective-C处理程序?

将匿名类型转换为C#中的列表

为什么此代码中没有类型转换异常?

为什么会出现此“无法转换类型的对象”异常?

为什么在c#中将对象强制转换为具有相同值的T类型的对象时,识别的对象不相同?

使用基类为运行时类型c#的虚拟方法时,无效的强制转换异常

在C#中强制转换泛型函数类型参数

强制转换为定义的C#类型时发生InvalidCastException

在C#中强制转换为反射类型

在C#中强制转换为任何类型的泛型

类型的C#通用约束可强制转换

从C#中的未知类型进行强制转换

为什么我必须强制转换为类型参数,而不能使用受约束的类型?

为什么将通用返回类型强制转换为另一个通用类型?

为什么某些值类型的数组之间的强制转换似乎破坏了类型的安全性?

为什么 Rust 中的原始类型之间没有隐式类型转换(强制)

为什么使用匿名类型获取方法?

LINQ匿名强制转换异常

C ++ POW异常类型转换

为什么不为相同大小类型之间的类型转换重新解释强制强制copy_n?

为什么我需要在C#显式实现中将'this'转换为接口类型?

为什么不能在C#中将null转换为类型T的参数?

C# - 为什么将类型转换为对象的工作原理是这样的?

为什么不能强制转换的泛型类型无法隐式转换?