匿名类型的 C# 类型转换异常,为什么?
C# type cast exception for anonymous type, why?
我有一个非常简单的代码片段:
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)
为什么会这样,如何修复我的代码?
类型不具体。它们现在形状相同,但这是巧合。在为具体 class 构建数据时,我尝试只使用匿名类型作为中间步骤,并且匿名类型很少离开单个方法的范围。
匿名类型难以测试,难以传递,而且如您所见,也难以转换。
我有时使用匿名类型来 return 来自 Web api 方法的数据,因此在序列化为 JSON 时为响应提供特定的形状。但是,消费者通常是 JS 客户端,不依赖于 C# 类型、匿名或具体来将 JSON 反序列化为对象。
我有一个非常简单的代码片段:
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)
为什么会这样,如何修复我的代码?
类型不具体。它们现在形状相同,但这是巧合。在为具体 class 构建数据时,我尝试只使用匿名类型作为中间步骤,并且匿名类型很少离开单个方法的范围。
匿名类型难以测试,难以传递,而且如您所见,也难以转换。
我有时使用匿名类型来 return 来自 Web api 方法的数据,因此在序列化为 JSON 时为响应提供特定的形状。但是,消费者通常是 JS 客户端,不依赖于 C# 类型、匿名或具体来将 JSON 反序列化为对象。