匿名类型

我有一个Dictionary(TKey, TValue)类的

 Dictionary Deduction_Employees = new Dictionary(); 

后来我在这个数组列表中添加了这样的匿名类型

 var day_and_type = new { TheDay = myDay, EntranceOrExit = isEntranceDelay }; Deduction_Employees[Employee_ID].Add(day_and_type); 

现在我该如何取消对var的访问并访问这些属性?

首先,您不是拆箱类型。 匿名类型是引用类型,而不是结构。

即使你可以在技术上创建它们声明的方法之外的相同类型的实例(根据C#3.0语言规范的7.5.10.6节,其中规定:

在同一程序中,两个匿名对象初始值设定项以相同的顺序指定相同名称和编译时类型的属性序列,这将生成相同匿名类型的实例。

)您无法获取所需类型的名称 ,以便从Object执行转换回您创建的类型。 您将不得不求助于一个具有内在缺陷的示例解决方案 。

逐个示例是有缺陷的,因为从设计的角度来看,每个想要在声明的函数外部访问类型的地方(并且仍在同一个模块中),您必须再次有效地声明类型。

这是一种重复的努力,导致设计和实施的草率。

如果您使用的是.NET 4.0,则可以将对象实例放在动态变量中。 但是,主要缺点是缺乏成员访问的编译时validation。 您可能很容易拼错该成员的名称,然后您有一个运行时错误而不是编译时错误。

最终, 如果您发现需要在声明的方法之外使用匿名类型,那么唯一的好解决方案是创建具体类型并将匿名类型替换为具体类型。

有几种方法。

由于注释似乎表明我建议你这样做,让我说清楚: 你应该为你的对象创建一个命名类型,因为你打算传递它。

首先,您可以使用Reflection,这里已经指出了另一个答案。

另一种方法,它将.NET用于提供正确的类型,称为“按示例执行”,它类似于:您需要通过generics方法调用传递您的对象,这将返回对象作为正确的类型,通过推断正确的类型返回。

例如,试试这个:

 private static T CastByExample(T example, object value) { return (T)value; } 

并使用它:

 var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj); 

这两个? 斑点,您只需要传递适合这些属性的数据类型的东西,不会使用这些值。

这利用了以下事实:在同一个程序集中,包含完全相同属性,相同类型,相同顺序的多个匿名类型将映射到同一个单一类型。

但是,此时您应该创建一个命名类型。

匿名类型具有方法范围。 要在方法边界外传递匿名类型或包含匿名类型的集合,必须先将类型转换为对象。 然而,这打败了匿名类型的强类型。 如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型。

来源: http : //msdn.microsoft.com/en-us/library/bb397696.aspx

不,你不能。 您只能使用reflection访问属性。 编译器无法知道类型是什么,并且由于它是匿名类型,因此您也无法对其进行转换。

如果您使用的是.NET 1.x – 3.x,则必须使用reflection。

如果使用.NET 4.0,则可以使用动态类型并调用预期的属性。

在这两种情况下你都不需要拆箱; 这是价值类型。 匿名类型始终是引用类型。