【问题标题】:How to copy an array to extended array?如何将数组复制到扩展数组?
【发布时间】:2013-06-16 06:42:52
【问题描述】:

我已经这样定义了我的扩展类:

public class ExtendedAttributeMetadata : AttributeMetadata
{
    public bool IsTwoOption { get; set; }
}

但是在将AttributeMetadata[] 类型的源数组复制到我的新目标数组ExtendedAttributeMetadata[] 后,我得到InvalidCastException

“源数组中的至少一个元素无法转换为目标数组类型。”

代码:

AttributeMetadata[] attributes;
//...
ExtendedAttributeMetadata[] extendedAttributes = new ExtendedAttributeMetadata[attributes.Length];                
attributes.CopyTo(extendedAttributes, 0);

添加:

其中AttributeMetadata 派生自元数据库

public class AttributeMetadata : MetadataBase

MetadataBase 是一个抽象类。

public abstract class MetadataBase : IExtensibleDataObject

请就我的情况提出最佳和最佳的复制方式。

【问题讨论】:

  • 原始数组从何而来?似乎很清楚,原始数组的至少一个元素不是ExtendedAttribute 类型。
  • 原始数组是 Attribute[] 类型,我从中扩展了我的类。
  • 您的编辑不会改变任何内容:您正试图将ExtendedAttributeMetadata 类型的 对象复制到ExtendedAttributeMetadata 类型的数组中。这是不可能的。

标签: c# arrays copy .net


【解决方案1】:

您无法将基类复制到派生类,因此您必须生成它:

var extendedAttributes = 
   attributes.Select(p=>new ExtendedAttribute{IsTwoOption=true/false}).ToArray();

【讨论】:

    【解决方案2】:

    属性列表只是AttributeMetadata抽象基类吗?

    您收到该错误是因为列表中有不属于 ExtendedAttributeMetadata 类型的属性

    您可以使用 linq 语句过滤掉这些:

    var extendedAttributes = attributes.OfType<ExtendedAttributeMetadata>().ToArray();
    

    【讨论】:

    • 如果您将 ExtendedAttribute 替换为 ExtendedAttributeMetadata,OfType 过滤器应该仍然有效。
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多