我有一个 Dictionary(TKey, TValue)

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>();

和后来我添加到该数组列表匿名类型这样

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,则放置对象实例中的动态变量。然而,主要的缺点是缺乏的成员访问编译时验证。你可以很容易拼错的成员的名字,然后你有一个运行时错误而不是编译时错误的。

最后,如果您发现需要使用匿名类型,它在声明的方法之外,则只有好的解决方案是创建一个具体类型并替换为匿名类型的具体类型

其他提示

有几种方法。

由于这些评论似乎表明,我建议你这样做,让我说清楚:您应该因为你打算到处传递它创建为对象命名类型

首先,你可以使用反射,在这里另一个答案已经指出了。

另一种方式,其招数.NET到给你正确的类型被称为“举例投”,它是这样的:你需要通过一个通用的方法调用,这将返回对象为越过你的对象正确的类型,通过推断正确的类型来回报。

例如,尝试这样:

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

和使用它:

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

对于两个??点,你只需要传递的东西拟合这些属性的数据类型,值将不被使用。

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

然而,在这时间你应该创建一个名为类型代替。

  

这是匿名类型具有方法的范围。要通过一个匿名类型,或包含匿名类型,一种方法边界之外的收集,必须先投类型的对象。然而,这违背了匿名类型的强类型。如果您必须存储您的查询结果或通过他们的方法边界之外,可以考虑使用,而不是匿名类型的普通命名结构或类。

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

没有你不能。您只能通过使用反射访问属性。编译器无法知道类型是什么样的路,因为它是一个匿名类型,你可以不投,要么。

如果您使用.NET 1.x的 - 3.x的,则必须使用反射

如果您使用.NET 4.0,你可以使用一个动态类型和调用预期的性能。

在两种情况下你需要拆箱;这是值类型。匿名类型总是引用类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top