【问题标题】:Change object type of a existing collection (OptionMetadataCollection) and mapping of existing types更改现有集合的对象类型 (OptionMetadataCollection) 和现有类型的映射
【发布时间】:2012-12-29 18:44:30
【问题描述】:

最终解决方案:

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 库的一部分,在其 Ilist 中有 OptionMetaData 对象。

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

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

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

    public string MappedName { get; set; }
}

但是我如何将当前位于OptionMetadatacollection 中的Ilist&lt;OptionMetaData&gt; 更改为我的IList&lt;CustomOptionMetaData&gt;。我知道我可以创建自己的 CustomOptionMetaDataCollection 的 Ilist,但是我会(将我的想法放在代码的其余部分上)列出使用具有更高级集合类的类似东西。

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

非常感谢任何帮助。

【问题讨论】:

  • 您的问题是如何从 Microsoft 定义的类中初始化自定义类?另外,我不明白您从自定义类中获得了什么好处......
  • 请参阅下面的答案评论。感谢您的宝贵时间。
  • 我会使用 Where,而不是 FindAll。 find all 将创建一个新列表,复制所有值,Where 将仅枚举您当前的列表。

标签: c# .net dynamics-crm-2011


【解决方案1】:

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

让我们暂时将IList 排除在外 - 毕竟它只是持有该类的多个副本。

在最简单的层面上你基本上想要做的:

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

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

正如 Adam Wright 在 A way of casting 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();

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

【讨论】:

  • 感谢您的帮助。我需要确切地知道你的回答。我想知道这种向下转换是否值得支持。我还想知道集合是否不仅仅是一个 Ilist,因此我是否可以/应该替换集合定义的 Ilist 中的对象。但你的答案很明确,我会创建一个 Ilist。另外: .Select(metadata => new CustomOptionMetadata(metadata)).ToList();这就是我所说的映射。我不想循环一个列表来填充另一个列表,这正是我想要解决的问题。非常感谢
  • @Hendricks 你确实意识到在幕后,选择只是一个循环?
  • @Daryl,是的,但我正在尝试在开发过程中学习一些知识,而且我知道有一种比编写自己的 foreach 循环“更干净”的方法。所以这是我正在寻找的一部分。谢谢达里尔。任何其他提示或点,例如我的最终解决方案总是非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2018-07-27
相关资源
最近更新 更多