2009-12-30 2 views
0

이제 ASP.NET MVC 2에서 작업하고 있습니다. Model 프로젝트의 기본 클래스에서 파생 된 View Model 클래스에 대해 심각한 문제가 발견되었습니다. 데이터베이스에서 데이터를 가져올 때마다 대부분의 OOP 언어에서 불가능한 View Model 인스턴스로 캐스팅해야합니다.C# 4.0에서 기본 클래스 인스턴스와 파생 클래스 인스턴스의 가장 좋은 방법은 무엇입니까?

기본 클래스

public class MyBaseClass 
{ 
    public string ID { get;set; } 
    public string Value { get;set; } 
} 

public class MyDerivedClass : MyBaseClass, ISomeInterface 
{ 
    // logic for My Derived Class 
} 

그러나, 내가 좋아하는 파생 클래스의 인스턴스에 기본 클래스의 인스턴스에서 읽기 가능한 모든 속성을 복사 몇 가지 방법을 만들려고

파생 클래스 다음 코드.

public static TDerived CastObject<TBase, TDerived>(TBase baseObj) 
{ 
    Type baseType = typeof(TBase); 
    Type derivedType = typeof(TDerived); 

    if (!baseType.IsAssignableFrom(derivedType)) 
    { 
     throw new Exception("TBase must be a parent of TDerived."); 
    } 

    TDerived derivedObj = Activator.CreateInstance<TDerived>(); 

    foreach (PropertyInfo pi in baseType.GetProperties()) 
    { 
     if (pi.CanRead) 
     { 
      PropertyInfo derivedProperty = derivedType.GetProperty(pi.Name); 

      if (derivedProperty.CanWrite) 
      { 
       derivedProperty.SetValue(derivedObj, pi.GetValue(baseObj, null), null); 
      } 
     } 
    } 

    return derivedObj; 
} 

하지만 대규모 웹 사이트에서 훌륭한 일을하고 나도 몰라 C# 4.0의 DLR의 기능이 많이가있는 것입니다 위의 코드에 대해 확실하지 않습니다.

C# 4.0을 사용하여 항목을 변환 할 생각이 있습니까?

감사합니다,

+0

모든 값을 파생 클래스에 복사하려는 이유를 설명 할 수 있습니다. – Bobby

+0

체크 인스턴스 유형에 인터페이스가 있거나 없는지 다른 코드가 있기 때문에 생성 된 코드의 일부이기 때문에 기본 클래스를 수정할 수 없습니다. –

답변

1

은 기본 유형에서 데이터를 복사 할 수있는 인스턴스를했다 생성자를 가질 수없는 어떤 이유가 있습니까?

public class MyBaseClass 
{ 
    public string ID { get;set; } 
    public string Value { get;set; } 

    public MyBaseClass() {} 

    public MyBaseClass(MyBaseClass other) 
    { 
     ID = other.ID; 
     Value = other.Value; 
    } 
} 


public class MyDerivedClass : MyBaseClass, ISomeInterface 
{ 
    public MyDerivedClass(MyBaseClass other) : base(other) 
    {   
    } 
} 

또는 대신 상속 대신 구성으로이 작업을 수행 할 수 있습니까? 귀하의 파생 된 클래스가 그 값과 ID를 얻기 위해 MyBaseClass의 인스턴스에 대한 참조를 유지할 수 있습니까?

마지막으로 데이터 액세스 레이어를 변경하여 시작할 수있는 올바른 클래스의 인스턴스를 만들 수 있습니까?

+0

당신이 대답하는 것처럼 그것은 매우 쉽습니다. 하지만 기본 클래스는 VS 2010 B2에서 EF 4.0의 POCO 템플릿에 의해 생성되므로 작동하지 않습니다. –

+0

@Soul_Master : 부분 클래스로 생성 되었습니까? 그렇다면 자신 만의 생성자를 다른 파일에 추가 할 수 있습니다. –

+0

아주 나쁜 생각입니다. 왜냐하면 생성 된 클래스의 속성이 변경 될 때 부분 클래스에서 생성자를 변경해야하기 때문입니다. 나에게 의미가 없다. 현재 솔루션은 솔루션보다 대규모 프로젝트에서 잘 작동해야한다고 생각합니다. –

관련 문제