对象与DesignData中的目标类型不匹配

时间:2010-05-28 19:52:50

标签: visual-studio-2010

如果有人之前遇到过这种情况,我会把它丢掉。

在WPF设计器中创建DesignData时,我得到两个错误之一:

  

对象与目标类型不匹配。
  在System.Reflection.RuntimeMethodInfo.CheckConsistency(Object   目标)
  的(SNIP)
  在Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder中。 UpdateProperty(IInstanceBuilderContext   context,ViewNode viewNode,IProperty   propertyKey,DocumentNode valueNode)

另一个提供更多信息:

  

值“_.di0.MyProjectLol.MyType”   不是“MyProjectLol.MyType”类型   并且不能用于此通用   集合。
  在   System.ThrowHelper.ThrowWrongValueTypeArgumentException(对象   value,Type targetType)
  的(SNIP)
  在Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder中。   InstantiateChildren(IInstanceBuilderContext   context,ViewNode viewNode,   DocumentCompositeNode compositeNode,   Boolean isNewInstance)

调试时,我可以看到有一个动态程序集加载了像我这样看起来的代理类型,但显然不是。这个程序集叫做Blend_RuntimeGeneratedTypeAssembly(Guid在这里)。尝试在此程序集中加载类型时,它会为许多类型引发类型加载异常。所以,有些类型被代理,有些类型被保留为上帝和我的意图,并且当它们混合时会出现不自然的行为。

例如,类型“Foo”可能会创建一个代理,但没有其他类型(TypeLoadExceptions)。然后设计师尝试将我的一个真实类型的代理交给代理(由于xaml序列化喜欢将集合转换为IList,从而影响类型安全),并且您得到上述异常之一。

我花了半个星期试图解决这个问题。我已经尝试了一百种不同的东西,但我无法确切地知道导致它失败的原因。欢迎提出建议,TIA。

2 个答案:

答案 0 :(得分:5)

解决方案分为两部分:

1)确保VS完全更新。此时,这意味着为Visual Studio 2010安装Silverlight 4 tools。它们包括WPF设计器的最新更新。如果你在遥远的未来阅读这篇文章,请忽略这一点。

2)点击设计数据文件的属性。清除“自定义工具”,并将“构建操作”设置为“DesignData”或“DesignTimeDataWithDesignTimeCreatableTypes”。

DesignData意味着您的类型无法直接从xaml反序列化(由于依赖性等),因此设计人员尝试为这些类型创建模拟并将模拟呈现给您的设计图层。

DesignTimeDataWithDesignTimeCreatableTypes意味着设计人员将加载程序集并将xaml直接反序列化到您的类型中,而不会创建模拟。

答案 1 :(得分:1)

这也可能由某种情况组合引起,这些情况在组合时会导致反序列化失败。

基本上如果你有

  • 自定义集合或未实施的集合 IList
  • 这是作为您的类型
  • 的属性公开的
  • 在不同的程序集中定义

您也可以收到此错误消息。

如果要将它们与xaml序列化,那么集合属性类型实现IList(非泛型属性)非常重要!