2010-11-21 3 views
0

http://msdn.microsoft.com/en-us/library/system.data.datatable.clone.aspx에 따르면 "이 클래스가 파생 된 경우 복제본의 파생 클래스도 동일합니다."System.Data.DataTable 파생 된 경우 DataTable.Clone에서 파생 클래스를 어떻게 반환합니까?

아래의 예제 코드에서 기본 클래스의 clone 메서드는 파생 클래스를 만들 때 "알 수 있습니까?" System.Data.DataTable가 클로닝

public class MyDataTable : System.Data.DataTable 
     { 
      public override System.Data.DataTable Clone() 
      { 
       //How is this a MyDataTable not a "DataTable" ? 
       return base.Clone(); 
      } 
     } 

     static void Main(string[] args) 
     { 
      MyDataTable dt = new MyDataTable(); 
      System.Diagnostics.Debug.Assert(dt.Clone() is MyDataTable); 
     } 

답변

1

, 당신은 (데이터 집합) 메소드 민간 복제에 의해 호출이 방법을 접하게 : 즉

protected virtual DataTable CreateInstance() 
{ 
    return (DataTable) Activator.CreateInstance(base.GetType(), true); 
} 

를, 그것의 새로운 인스턴스를 생성하여 DataTable이 아닌 클래스입니다. 이 복제본에는 일반적인 DataTable 속성의 전체 복사본이 있지만 생성자에서 추가했지만 할당하지 않은 필드는 기본값을 갖게되므로주의해야합니다.

+0

멋지다 - 고마워! –

1

, 그것은 궁극적 DataTable의 기본 형태를 구성 활성제 클래스를 사용하여 보호 부재의 DataTable CreateInstance 함수를 호출한다.

protected virtual DataTable CreateInstance() 
{ 
    return (DataTable) Activator.CreateInstance(base.GetType(), true); 
} 

여기서 GetType은 MyDataTable에 대한 실제 Type 참조를 반환합니다. 기본 클래스에서 GetType을 호출하는 경우에도 MyDataTable의 실제 인스턴스 유형이 반환됩니다. 또한 메모로 Activator 클래스는 수동으로 리플렉션을 사용하여 ConstructorInfo를 조회하여 객체의 새 인스턴스를 만들지 않고도 형식 데이터를 기반으로 새 객체를 구성하는 간단한 방법입니다.

당신은 질문의이 유형에보고하기위한 MSDN

환상적인 프로그램에 액티베이터 클래스에 대한 자세한 정보를 찾을 수 있습니다 Reflector는 (무료!)입니다. 리플렉터를 사용하면 어셈블리의 내부를보고 실제 발생 상황을 볼 수 있습니다. 당신은 리플렉터와 DataTable에 대한 코드를 파고 경우

관련 문제