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