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

时间:2019-06-05 08:17:59

标签: c# types casting anonymous

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

    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) 

那是为什么,如何修复我的代码?

1 个答案:

答案 0 :(得分:0)

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

匿名类型很难测试,难以传递,并且很难发现。

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