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ライブラリの一部であり、その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>しかし、現在にあるものOptionMetadatacollectionを自分のに変更するにはどうすればよいですかIList<CustomOptionMetaData>。私は自分のIlistを作成できることを認識していますが、CustomOptionMetaDataCollection(コードの残りの部分を念頭に置いて)リストを作成して、より高度なコレクションクラスと同じものを使用します。

OptionMetaDataCollectionまた、オブジェクトを自分のにマップする方法も考えていCustomOptionMetadataCollectionます。ループを作成することはできますが、マッピングを行うためのより効率的な方法を探しています。

どんな助けでも大歓迎です。

4

1 に答える 1

3

IList<OptionMetadata>を に変換したい場合IList<CustomOptionMetadata>は、効果的に質問しています。OptionMetadata基本クラス ( ) を派生クラス ( )に変換するにはどうすればよいCustomOptionMetadataですか?

とりあえず方程式から外してみましょうIList- 結局のところ、クラスの複数のコピーを保持しているだけです。

最も単純なレベルでは、基本的にやりたいことは次のとおりです。

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

残念ながら、このタイプのダウンキャストは実際には C# が行うものではありません。

Adam Wrightが基本型を派生型にキャストする方法で説明しているように。

これはダウンキャストであり、それを処理する適切な方法はありません。. . (サブクラスは基本クラス以上のものを提供します - この「より多く」はどこから来るのでしょうか?)

つまり、これを処理する他の方法があります。たとえば、基本クラスを取るカスタム クラスにコンストラクターを追加するなどです。

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 に答える