【问题标题】:Object of type 'X[]' cannot be converted to type 'X[]'“X[]”类型的对象无法转换为“X[]”类型
【发布时间】:2017-10-24 16:01:37
【问题描述】:

我有一个具有如下属性的控件:

public BindingList<I> X { get; private set; } = new SortableBindingList<I>();

I 是一个接口。它构建良好,运行良好,但是当我将此控件添加到表单时(无论该表单是否在同一个程序集中都无关紧要),然后尝试在 Visual Studio(2017)中打开该表单,该表单是未显示并出现以下错误消息:

“I[]”类型的对象无法转换为“I[]”类型。

调用堆栈为:

在 System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo 文化,布尔需要SpecialCast)在 System.RuntimeType.CheckValue(对象值,Binder binder,CultureInfo 文化,BindingFlags 调用Attr)在 System.Reflection.RtFieldInfo.UnsafeSetValue(对象 obj,对象值, BindingFlags invokeAttr、Binder binder、CultureInfo 文化)在 System.Runtime.Serialization.FormatterServices.SerializationSetValue(MemberInfo fi,对象目标,对象值)在 System.Runtime.Serialization.ObjectManager.CompleteObject(ObjectHolder 持有人,布尔 bObjectFullyComplete) 在 System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolder 持有人)在 System.Runtime.Serialization.ObjectManager.RegisterObject(对象 obj, Int64 objectID, SerializationInfo info, Int64 idOfContainingObj, MemberInfo 成员,Int32[] arrayIndex) 在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject(对象 obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString) at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEnd(ParseRecord 公关)在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse(ParseRecord 公关)在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() 在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler 处理程序,__BinaryParser serParser,布尔 fCheck,布尔 isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 serializationStream, HeaderHandler 处理程序, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 序列化流)在 System.Resources.ResXDataNode.GenerateObjectFromDataNodeInfo(DataNodeInfo dataNodeInfo, ITypeResolutionService typeResolver) 在 System.Resources.ResXDataNode.GetValue(ITypeResolutionService 类型解析器)在 System.Resources.ResXResourceReader.ParseDataNode(XmlTextReader 阅读器,布尔 isMetaData)在 System.Resources.ResXResourceReader.ParseXml(XmlTextReader reader)

我尝试添加

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

分别按照https://stackoverflow.com/a/29720/68936https://stackoverflow.com/a/29717/68936

我也尝试将 getter-setter 替换为

private BindingList<I> myX = new SortableBindingList<I>();
public BindingList<I> myX { get { return myX; } }

根据https://stackoverflow.com/a/16657926/68936

无济于事。我试过关闭所有打开的文档,关闭解决方案,重新启动 Visual Studio,重建两个程序集,似乎没有任何解决办法。

【问题讨论】:

  • 我在 IIS 中遇到了同样的错误,其中 X 包含 ValueTuple。这是一个在运行时在 .NET 4.7 下运行的 .NET 4.6 项目。 IIS 进程从 mscorlib (4.7) 加载 ValueTuple,即使在编译时它引用 DLL 中的 ValueTuple(DLL 文件版本 4.6.26515.6)。 IIS 项目直接引用一个 .NET 4.6 exe 文件,它也作为外部进程生成。生成此 exe 时,它​​使用正确的 ValueTuple 4.6 DLL,但无法反序列化从使用 mscorlib 版本的 ValueTuple 的 IIS 进程发送的数据。

标签: visual-studio-2017 windows-forms-designer


【解决方案1】:

我能够使用它

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public BindingList<I> myX { get; private set; } = new SortableBindingList<I>();

并且通过编辑包含表单的 .resx 文件(不是控件的)并删除如下所示的 xml 元素:

  <data name="controlName.X" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAJsBSW50ZXJmYWNlc0ludmVzdG1lbnRzLCBWZXJzaW9uPTEuMC4w
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dLCBtc2NvcmxpYiwgVmVyc2lv
        bj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkM
        AwAAAExJbnRlcmZhY2VzSW52ZXN0bWVudHMsIFZlcnNpb249MS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFs
        LCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAABOU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAx
        W1tLYW1hVHJlbmRhLkludGVyZmFjZXMuSW52ZXN0bWVudHMuSVBvc2l0aW9uAwAAAAZfaXRlbXMFX3Np
        emUIX3ZlcnNpb24EAAAtS2FtYVRyZW5kYS5JbnRlcmZhY2VzLkludmVzdG1lbnRzLklQb3NpdGlvbltd
        AwAAAAgIAgAAAAkEAAAAAAAAAAAAAAAHBAAAAAABAAAAAAAAAAQrS2FtYVRyZW5kYS5JbnRlcmZhY2Vz
        LkludmVzdG1lbnRzLklQb3NpdGlvbgMAAAAL
</value>
  </data>

似乎只是添加 DesignerSerializationVisibility.Hidden 不足以从现有的 .resx 文件中删除该现有数据节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多