C# 更改现有集合的对象类型(OptionMetadataCollection)和现有类型的映射
最终解决方案:C# 更改现有集合的对象类型(OptionMetadataCollection)和现有类型的映射,c#,.net,dynamics-crm-2011,C#,.net,Dynamics Crm 2011,最终解决方案: public class CustomOptionMetadata : OptionMetadata { public CustomOptionMetadata(OptionMetadata optionMetadata) : base() { this.Description = optionMetadata.Description; this.ExtensionData = optionMetadata.ExtensionDa
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; }
}
但是,如何将当前位于OptionMetadatacollection中的Ilist更改为我的Ilist。我知道我可以为CustomOptionMetaDataCollection创建自己的Ilist,但是我会将注意力放在代码列表的其余部分,将simulair与更高级的集合类一起使用
我还想知道如何将OptionMetaDataCollection对象映射到我的CustomOptionMetadataCollection。我可以创建一个循环,但我正在寻找一种更有效的方法来进行映射
非常感谢您的帮助。如果您想将IList转换为IList,您实际上是在请求;如何将基类OptionMetadata转换为派生类CustomOptionMetadata
让我们暂时把IList从等式中去掉——毕竟它只保存了类的多个副本
在最简单的层面上,您基本上想要做:
OptionMetadata optionMetadata = new OptionMetadata();
CustomOptionMetadata customOptionMetadata = (CustomOptionMetadata)optionMetadata;
不幸的是,这种类型的向下投射并不是C真正做的事情
正如亚当·赖特在书中所描述的那样
这是一种堕落,没有理智的堕落方式来处理它。子类提供的不仅仅是基
课程-这更多来自哪里
也就是说,还有其他方法可以处理这个问题,例如,向接受基类的自定义类添加构造函数
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();
我不太清楚你所说的将一个集合“映射”到另一个集合是什么意思,但这听起来有点像你试图将基类向下转换为派生类的问题。您的问题不清楚您试图实现什么,派生类实际上在做什么?。如果您只想将一个集合的内容复制到另一个集合,我建议您看看。您的问题是如何从Microsoft定义的类初始化自定义类?另外,我不明白您从自定义类中得到了什么好处…请参见下面的答案评论。谢谢你的时间。我会用Where,而不是FindAll。“全部查找”将创建一个新列表,复制所有值,其中将仅枚举当前列表。感谢您的帮助。我需要知道你到底回答了什么。我想知道这种类型的下调是否值得支持。我还想知道集合是否不仅仅是一个Ilist,因此我是否可以/应该替换集合定义的Ilist中的对象。但你的答案很清楚,我将创建一个Ilist。另外:.Selectmetadata=>new CustomOptionMetadatametadata.ToList;这就是我所说的映射。我不想循环一个列表来填充另一个列表,这正是我想要解决这个问题的方式。多谢各位much@Hendricks你知道在封面下,select只是一个循环吗?@Daryl,是的,我知道,但我在做开发的时候尝试学习一些东西,我知道有一种比编写自己的foreach循环更干净的方法。所以这是我要找的东西的一部分。谢谢你,达里尔。任何其他提示或要点,例如我的最终解决方案,都将受到高度赞赏。
OptionMetadata optionMetadata = new OptionMetadata();
CustomOptionMetadata customOptionMetadata = new CustomOptionMetadata(optionMetadata);
IList<OptionMetadata> optionMetadata = new List<OptionMetadata>()
{
new OptionMetadata(),
new OptionMetadata()
};
IList<CustomOptionMetadata> customOptionMetadata = optionMetadata
.Select<OptionMetadata, CustomOptionMetadata>(metadata => new CustomOptionMetadata(metadata)).ToList();