1

最终解决方案:

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在其 Ilist 中有对象。

现在我想创建这样的东西:

public partial class CustomOptionMetadataCollection : OptionMetadataCollection
{
    public CustomOptionMetadataCollection() : base() { }
}

public partial class CustomOptionMetadata : OptionMetadata
{
    public CustomOptionMetadata() : base() { }

    public string MappedName { get; set; }
}

但是我将如何将Ilist<OptionMetaData>当前位于OptionMetadatacollection我的IList<CustomOptionMetaData>. 我知道我可以制作自己的 Ilist CustomOptionMetaDataCollection,但是我会(在我的其余代码上考虑)列出使用具有更高级集合类的类似东西。

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

任何帮助深表感谢。

4

1 回答 1

3

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

让我们IList暂时把这个等式排除在外——毕竟它只是持有该类的多个副本。

在最简单的级别上,您基本上想要做:

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

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

正如 Adam Wright 在A way of cast a base type to a derived type 中所描述的那样。

这是令人沮丧的,并且没有理智的方法来处理它,. . . (子类提供的不仅仅是基类——这个“更多”来自哪里?)

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

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();

我不太确定您将一个集合“映射”到另一个集合是什么意思,但这听起来有点像您试图将基类向下转换为派生类的问题。从您的问题中不清楚您要实现什么(派生类实际上在做什么?)。如果您只想将一个集合的内容复制到另一个集合,我建议您查看如何在没有 foreach 的情况下将项目从列表复制到列表?.

于 2013-01-16T00:01:51.803 回答