2017-05-21 13 views
0

私は2つのクラスを持ち、そのうちの1つは他のクラスから派生しています。コピーリスト<BaseList>リストへのオーバーライドプロパティ付きの<DerivedList> c#

public class BaseClass 
{ 
    private int iD; 
    private string name; 
    private int typeID; 

    public int ID { get => iD; set => iD = value; } 
    public string Name { get => name; set => name = value; } 
    public virtual int TypeID { get => typeID; set => typeID = value; } 
} 
public class DerivedClass : BaseClass 
{ 
    private int typeID; 
    private string typeName; 
    private Types types; // This is a list of some other objects to lookup; 

    public DerivedClass(Types types) 
    { 
     this.types = types; 
    } 

    public override int TypeID 
    { 
     get => typeID; 
     set 
     { 
      typeID = value; 
      typeName = types.Where(o => o.ID == value).FirstOrDefault().Name; 
     } 
    } 
    public string TypeName { get => typeName; } 
} 
public class Type 
{ 
    public int ID; 
    public string Name; 
} 
public class Types : List<Type> { }; 

List<BaseClass> baseClassList = new List<BaseClass>(); 
baseClassList.Add(new BaseClass() {ID = 1, Name = "aaa", TypeID = 1}); 
baseClassList.Add(new BaseClass() { ID = 2, Name = "bbb", TypeID = 1 }); 

Types typeList = new Types(); 
typeList.Add(new Type() { ID = 1, Name = "LookupName" }); 

それは(私がforeach句を使用せずに意味)リスト内のすべてのオブジェクトを列挙することなく、DerivedClassのリストにBaseClassのリストをコピーすることは可能ですか?

オブジェクトを作成するためのコードをいくつか追加しました。

+1

"リスト内のすべてのオブジェクトを列挙せずに?" - いいえ – HimBromBeere

+0

あなたのリストには 'BaseClass'のインスタンスしかありません。それらを 'DerivedClass'にキャストしようとすると、' DerivedClass'のインスタンスではないので失敗します。 – Kyle

答えて

0

あなたは、リストのCast方法を試すことができますDerivedClassすべてのリストのメンバーがタイプであることを確認している場合:

List<BaseClass> baseList = new List<BaseClass>(); 

//Add some DerivedClass 
baseList.Add(new DerivedClass()); 
baseList.Add(new DerivedClass()); 

List<DerivedClass> derivedList = baseList.Cast<DerivedClass>().ToList(); 

EDIT:あなたのリスト項目は、タイプBaseClassであるならば、あなたはそれらをキャストすることはできませんが、あなたはよいですDerivedClassにこの方法をそれらを変換:

BaseClass

を受け入れ DerivedClassためのコンストラクタを作成します。
public DerivedClass(BaseClass baseClass) 
{ 
    this.typeID = baseClass.TypeID; 

    this.typeName = baseClass.Name; 

    //and ... 
} 

その後:

List<BaseClass> baseList = new List<BaseClass>(); 

//Add some DerivedClass 
baseList.Add(new BaseClass()); 

List<DerivedClass> derivedList = baseList.Select(i => new DerivedClass(i)).ToList(); 
+1

'()'の代わりに 'OfType ()'を使う方が良いかもしれません。これはすべてのリストメンバーがDerivedClass型のものではない状況も扱うからです。アプリケーションシナリオでキャスト()の例外スローが必要な場合を除き... – elgonzo

+0

@elgonzoリストからそれらのDerivedClassを取得したい場合は、OfTypeがより良い解決策ですが、要素は 'DerivedClass'ですか?この場合、要素が「DerivedClass」でないかどうかを(例外を除いて)通知されたいと思うかもしれません。 –

+0

Cast、またはOfType、またはConvertAllは、このタイプでは機能しません。これは、あるタイプを他のタイプに直接変換できないためです。 – kord

関連する問題