2016-07-01 2 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 

어떻게 든 그것을 해결 및 변환 얻을 수있는 방법이 있나요 기본 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의를 반환하는 Basket.FromObject을 말한다.

그리고 당신은 상속 트리를 변경할 수없는 경우, 당신은 원래의 방법을 숨길 수 있습니다 (또는 공장에 배치) : BasketMyObject<ProductCart>,이지 않기 때문에

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

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

안녕하세요! 첫 번째 부분 (클래스 정의 변경)이 해결책이라고 생각합니다. 지금 작동하는 것처럼 보입니다! – DolceVita

0

의 그 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); 
    } 

} 

: 당신이 당신의 계층 구조를 다시 정의하지 않으려면

, 당신은 당신이 예에서와 같이, 통과 목적에 따라 정적 메서드의 반환 형식을 정의해야합니다 코멘트의 실제 구현은 "여기에 몇 가지 반사 논리"훨씬 더 복잡해질 수 있습니다 :)

관련 문제