【问题标题】:KeyValuePair - no parameterless constructor?KeyValuePair - 没有无参数构造函数?
【发布时间】:2011-06-01 22:45:22
【问题描述】:

我有一个具有 KeyValuePair 类型属性的对象。

我想从数据库中读取一些数据并将结果存储在这个 KeyValuePair 类型字段中。

myObject.KeyValuePairs = ctx.ExecuteQuery<KeyValuePair<String, int>>
                        ("Select " +
                            "[" + q.Name + "] As [Key]" +
                            ", Count([" + q.Name + "]) As [Value] From SomeTable" + 
                            " Group By [" + q.Name + "]").ToList(); 

myObject.KeyValuePairsList&lt;KeyValuePair&lt;String, int&gt;&gt;

当我尝试读取记录时,出现以下异常:

类型 'System.Collections.Generic.KeyValuePair`2[System.String,System.Int32]' 必须声明默认(无参数)构造函数才能在映射期间构造。

我在一个类中有一个默认构造函数,但这并不能解决问题。看起来好像它不知道如何构造一个 KeyValuePair 对象。它没有默认构造函数吗?迷茫了。。

谢谢

【问题讨论】:

  • 请参数化你的 sql Bobby Tables....
  • @BFree: +1 xkcd.com/327

标签: c# .net


【解决方案1】:

它确实有一个公共无参数构造函数,因为KeyValuePair&lt;TKey, TValue&gt; 是一个结构并且所有结构都有隐式的公共无参数构造函数。

问题是EF无法通过反射找到它,因为反射不返回struct的默认构造函数。

这就是 EF 报告它找不到它的原因(它无法通过反射找到它)。

此外,即使您可以通过反射使用默认构造函数,KeyValuePair&lt;TKey, TValue&gt; 也是不可变的,因此您无法在构造后设置KeyValue

要解决您的问题,请定义一个自定义类

class NameCount {
    public string Name { get; set; }
    public int Count { get; set; }
}

并更改您的查询以将Key 作为NameValue 作为Count 返回。我假设您可以为您的自定义类想出一个更好的名称。

【讨论】:

  • var f = new KeyValuePair(); msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx
  • @BFree: 很讨厌我忘记了这一点,因为我在几周前编写了一个方法HasDefaultConstructor(this Type type),显然我的单元测试在type.IsValueType 为真时发现了一个错误,所以我不得不添加逻辑if(this.IsValueType) { return true; }.
  • @Jason:呃,别自责了,反正我们多久写一次结构体,很容易被忽视....
  • 非常有意义。谢谢
  • 为什么不使用字段而不是属性?使用属性将结构字段包装在可变属性中是否有任何优势?属性可能会增加开销,这通常是轻微的,但在使用嵌套属性时可能会很大。在许多情况下,将类字段包装在属性中可能是有利的,但这些情况不适用于结构属性。据我所知,结构属性会增加开销而不会添加任何有用的语义,那么为什么要打扰它们呢?
猜你喜欢
  • 2011-11-24
  • 2014-08-31
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多