2016-07-08 5 views
1

私はC#を初めて使用しています。私は引数としてリストをとり、最初のものから取得したデータから別のものを返したいと思います。C#list in function param

private List<DestinationGenericMapProps> ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas) 
{ 
    var result = new List<DestinationGenericMapProps>(datas); 
    return result; 
} 

私はこのエラーを取得する:

Error 241 The best overloaded method match for System.Collections.Generic.List<VDDataUpdaterGeneric.DataObjects.DestinationGenericMapProps>.List(int) has some invalid arguments

私はこれはおそらく、かなり基本的なものを知っているが、私はC#に新たなんだ、これで苦労しています。ご協力いただきありがとうございます。

+0

は 'BoutiqueInWebService'と' DestinationGenericMapProps'されているすべてに関連:は直接キャストが不可能な場合は

var result = datas.Cast<DestinationGenericMapProps>().ToList() 

を、このような長い手キャストを行うことも可能です方法? –

+1

'Select' LINQ拡張メソッドを使って、関連しない型(あなたの場合は' BoutiqueInWebService')のリストから、別の型の 'List'(あなたの場合は' DestinationGenericMapProps')を生成することができます。 'datas.Select(boutique => DestinationGenericMapProps.FromBoutique(boutique))。ToList()'のようなものです。 – EvilTak

答えて

1

戻り値の型はDestinationGenericMapPropsのリストですが、BoutiqueInWebService(データ)のリストを作成しようとしています。

あなたの戻り値の型と一致するように、この操作を行うことができます。

private List<DestinationGenericMapProps> 
     ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas) 
{ 
    return (from d in datas 
      select new DestinationGenericMapProps() 
      { 
       // map properties here 
       Prop1 = d.SomePropInData 
      }).ToList(); 
} 
3

List<BoutiqueInWebService>は、List<DestinationGenericMapProps>ではありません。

BoutiqueInWebServiceDestinationGenericMapPropsから派生しない限り、これは機能しません。

基本的には、List<T>(IEnumerable<T>)コンストラクタがありますが、Tは同じである必要があります。あなたが作る方法を知っていれば、

private List<DestinationGenericMapProps> ConstructDestinationMapPropsList(List<DestinationGenericMapProps> datas) 
{ 
    var result = new List<DestinationGenericMapProps>(datas); 
    return result; 
} 

代わり:タイプList<DestinationGenericMapProps>であることが

private List<BoutiqueInWebService> ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas) 
{ 
    var result = new List<BoutiqueInWebService>(datas); 
    return result; 
} 

したり、パラメータを変更します。

どちらかList<BoutiqueInWebService>にあなたの戻り値の型を変更し、新しいステートメントを変更DestinationGenericMapPropsBoutiqueInWebServiceから取得する場合は、System.Linqを使用して、引数に対してselectを実行できます。

private List<DestinationGenericMapProps> ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas) 
{ 
    var result = datas.Select(x => new DestinationGenericMapProps() { ... }).ToList(); 
    return result; 
} 
2

タイプ保護されていない別のタイプ(BoutiqueInWebService)のリストのオブジェクトで1つのタイプのリスト(DestinationGenericMapProps)を設定しようとしているため、エラーが発生しています。

BoutiqueInWebServiceがDestinationGenericMapPropsから継承する場合にのみこれを行うことができます。

1

C#のクラスは限りパラメータが異なっているのと同じ名前を持つ複数の機能を持たせることができることを意味し、関数のオーバーロードをサポートしています。コンパイラは、パラメータのタイプをコンパイルすることによって呼び出すオーバーロードを決定します。これはコンストラクタにも当てはまります。

Listクラスは、そのconstuctorの3つのオーバーロードがあります。

List<T>() 
List<T>(IEnumerable<T>) 
List<T>(int) 

私はあなたはそれが一つに渡されたから、新しいリストを作成するよう、それらの第二を使用しようとしていることを前提としています。あなたが作成しているリストは、DestinationGenericMapPropsです。したがって、コンストラクタは次のとおりです。

List<DestinationGenericMapProps>() 
List<DestinationGenericMapProps>(IEnumerable<DestinationGenericMapProps>) 
List<DestinationGenericMapProps>(int) 

リストにはTがBoutiqueInWebServiceに設定されています。したがって、コンパイラは上記のようなコンストラクタを見つけようとしています。

List<DestinationGenericMapProps>(IEnumerable<BoutiqueInWebService>) 

これは見つからないため、受信したエラーが発生します。

BoutiqueInWebServiceをDestinationGenericMapPropsオブジェクトにキャストすることは可能ですか?あなたがこれを行うことができれば:

var result = datas.Select(o => new DestinationGenericMapProps() { PropA = o.PropA, PropB = o.PropB /* etc */}).ToList();