2016-07-01 6 views
2

私は以下のクラスがあります。staticメソッドの戻り基底クラスのインスタンス

//some base class 
public abstract class MyObject<T>{ 

     public static T FromObject(object anotherObject){ 
     var t = Activator.CreateInstance<T>(); 
     // some reflection logic here 
     return t; 
    }  
} 

public class Product: MyObject<Product>{ 
} 

public class ProductCart: MyObject<ProductCart>{ 
    public ICollection<Product> Products{get;set;} 
} 

public class Basket: ProductCart{ 
    public int BasketId{get;set;} 
} 

public class Order: ProductCart{ 
    public int OrderId{get;set;} 
} 

をだから今、私はこのように私のモデルを構築することができ:

var products = serviceContext.Products.Select(Product.FromObject).ToList(); // no problem here 

var basket = Basket.FromObject(serviceContext.Basket); // problem is here - instance of ProductCart is returned 

var order = Order.FromObject(serviceContext.Order); // same problem, instance of ProductCart 

何とかそれを解決し、変換を取得する方法はありますベースカートの代わりにバスケットとオーダー?

目標は次のとおりです。助けるため

var basket = Basket.FromObject(serviceContext.Basket); // return instance of Basket inherited from ProductCart 

感謝。

答えて

1

あなたはクラス定義を変更することができれば、あなたはそうのように、ProductCartにタイプに沿って渡すことができます。あなたの定義では

public class ProductCart<T> : MyObject<T> { } 
public class Basket : ProductCart<Basket> { } 
public class Order : ProductCart<Order> {} 

を明示的に(MyObject<ProductCart>から継承して)ProductCart Sを返すようにBasket.FromObjectを教えてください。

そして、あなたは継承ツリーを変更することができない場合は、元のメソッドを隠蔽することを選択した(または工場に配置)することができます

public class Basket : ProductCart 
{ 
    public int BasketId { get; set; } 

    public Basket FromObject(object anotherObject) 
    { 
     return MyObject<Basket>.FromObject(anotherObject); 
    } 
} 
+0

こんにちは!私は最初の部分(クラス定義を変更する)が解決策だと思います。それは今のように見えます! – DolceVita

0

BasketMyObject<ProductCart>、およびでないためですMyObject<Basket>

あなたの階層を再定義したくない場合は、この例のように、あなたが渡す目的に応じて静的メソッドの戻り値の型を定義する必要があります。もちろん

using System; 

public abstract class MyObject<T> { 

    public static TOtherObject FromObject<TOtherObject>(TOtherObject anotherObject) where TOtherObject : MyObject<T> { 
     var newOtherTypeInstance = Activator.CreateInstance<TOtherObject>(); 
     // some reflection logic here 
     return newOtherTypeInstance; 
    } 
} 

public class ProductCart : MyObject<ProductCart> { 
} 

public class Basket : ProductCart { 
    public int BasketId { get; set; } 
} 

public class Order : ProductCart { 
    public int OrderId { get; set; } 
} 

class Program { 

    static void Main(string[] args) { 
     Order o = new Order(); 
     var basket = Basket.FromObject(o); 
    } 

} 

を、この時点で、コメントの実際の実装は "ここでいくつかの反射ロジック"は、はるかに複雑になる可能性があります:)

関連する問題