最终解决方案:
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; }
}
但是,如何将当前位于Ilist<OptionMetaData>
的{{1}}更改为OptionMetadatacollection
。我知道我可以制作我自己的IList<CustomOptionMetaData>
的Ilist,但是我(我会考虑其余的代码)列表使用simulair和更高级的集合类。
我也想知道如何将CustomOptionMetaDataCollection
对象映射到我的OptionMetaDataCollection
。我可以创建一个循环,但我正在寻找一种更有效的方法来进行映射。
非常感谢任何帮助。
答案 0 :(得分:3)
如果您想将IList<OptionMetadata>
转换为IList<CustomOptionMetadata>
,您实际上会问;如何将我的基类(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?。