更改现有集合(OptionMetadataCollection)的对象类型和现有类型的映射

本文关键字:类型 对象 映射 OptionMetadataCollection 集合 | 更新日期: 2023-09-27 17:53:32

最终解:

public class CustomOptionMetadata : OptionMetadata
{
    public CustomOptionMetadata(OptionMetadata optionMetadata) : base() 
    {
        this.Description = optionMetadata.Description;
        this.ExtensionData = optionMetadata.ExtensionData;
        this.Managed = optionMetadata.IsManaged;
        this.Label = optionMetadata.Label;
        this.MetadataId = optionMetadata.MetadataId;
        this.Value = optionMetadata.Value;
    }
    public string MappedName { get; set; }
    public bool? Managed { get; set; }
}

.

foreach (MappingEntity meAtt in mappingEntityList.FindAll(me => me.ParentID == meEnt.ID))
{
    CRMOrganizationEntityAttribute crmOrganizationEntityAttribute = new CRMOrganizationEntityAttribute(meAtt.ID, meAtt.Name, true);
    if (meAtt.IsPicklist)
    {
        List<OptionMetadata> optionMetadataList = GetAttributePickList(meEnt.Name, meAtt.Name);
        if (optionMetadataList.Count > 0)
        {
            crmOrganizationEntityAttribute.OptionMetadataColl = optionMetadataList.Select<OptionMetadata, CustomOptionMetadata>(metadata => new CustomOptionMetadata(metadata)).ToList();
        }
        else
        {
        }
    }
    CRMOrgEnt.CRMAttributeNameList.Add(crmOrganizationEntityAttribute);
}

============================================================================

我目前正在开发一个地图应用程序,它已经有很多自定义对象。为了限制类的查找和定义,我考虑扩展我所需要的已经存在的类。

OptionMetaDataCollection是Microsoft.Xrm.SDK.Metadata库的一部分,并且在它的列表中有OptionMetaData对象。

现在我想创建如下内容:

public partial class CustomOptionMetadataCollection : OptionMetadataCollection
{
    public CustomOptionMetadataCollection() : base() { }
}
public partial class CustomOptionMetadata : OptionMetadata
{
    public CustomOptionMetadata() : base() { }
    public string MappedName { get; set; }
}

但是我如何将目前在OptionMetadatacollection中的Ilist<OptionMetaData>更改为我的IList<CustomOptionMetaData>。我知道我可以制作自己的CustomOptionMetaDataCollection列表,但是我会(在代码的其余部分)列表使用更高级的集合类模拟。

我也想知道如何将OptionMetaDataCollection对象映射到我的CustomOptionMetadataCollection。我可以创建一个循环,但我正在寻找一种更有效的方法来进行映射。

更改现有集合(OptionMetadataCollection)的对象类型和现有类型的映射

如果你想将IList<OptionMetadata>转换为IList<CustomOptionMetadata>,你实际上是在问;如何将基类(OptionMetadata)转换为派生类(CustomOptionMetadata)?

让我们暂时把IList从等式中拿出来——毕竟它只是保存了类的多个副本。

在最简单的层面上,你基本上要这样做:

OptionMetadata optionMetadata = new OptionMetadata();
CustomOptionMetadata customOptionMetadata = (CustomOptionMetadata)optionMetadata;

不幸的是,这种类型的向下转换并不是c#真正做的。

正如Adam Wright在《一种将基类型强制转换为派生类型的方法》中所描述的那样。

这是向下的,没有正确的向下的方式来处理它,…(子类提供的不仅仅是基类类——这个"more"从何而来?)

也就是说,还有其他方法可以处理这个问题,例如,为您的自定义类添加一个构造函数,该构造函数采用基类。

class OptionMetadata
{
    public int X;
}
class CustomOptionMetadata : OptionMetadata
{
    public int Y;
    public CustomOptionMetadata(OptionMetadata metadata)
    {
        this.Y = metadata.X * 2;
    }
}

那么最简单的就是:

OptionMetadata optionMetadata = new OptionMetadata();
CustomOptionMetadata customOptionMetadata = new CustomOptionMetadata(optionMetadata);

IList放到上下文中。

IList<OptionMetadata> optionMetadata = new List<OptionMetadata>() 
{            
    new OptionMetadata(),
    new OptionMetadata()
};
IList<CustomOptionMetadata> customOptionMetadata = optionMetadata
    .Select<OptionMetadata, CustomOptionMetadata>(metadata => new CustomOptionMetadata(metadata)).ToList();

我不太确定你的意思是"映射"一个集合到另一个集合,但它听起来有点像同样的问题,你试图向下cast一个基类到派生类。从你的问题中不清楚你想要实现什么(派生类实际在做什么?)。如果您只是想将一个集合的内容复制到另一个集合,我建议您看看如何将项目从一个列表复制到另一个列表,而不需要foreach?