2010-06-18 5 views
4

:reflection을 사용하여 객체 기본 클래스 속성을 인스턴스화 할 수 있습니까? 이처럼

public class remoteStatusCounts : RemoteStatus 
{ 
    public int statusCount; 

    public remoteStatusCounts(RemoteStatus r) 
    { 
     Type t = r.GetType(); 
     foreach (PropertyInfo p in t.GetProperties()) 
     { 
      this.property(p) = p.GetValue(); //example pseudocode 
     } 
    } 
} 

예는 (그것이 락스의 API에서의 - RemoteStatus 4 개 속성이) 조금 간단하지만, 기본 클래스 30 개 속성을 가지고 상상. 상속 된 클래스에 몇 가지 추가 속성 만 있으면 특히 모든 값을 수동으로 설정하고 싶지 않습니다.

답변은 대답을 암시하는 것 같습니다.

은 내가 (? 내가 틀렸다면 정정 해줘 내가 생각하는) 기본 클래스 생성자를 호출 할 수 있습니다,하지만 내 기본 클래스 생성자를 가지고 있지 않는 Using inheritance in constructor (publix X() : y)에서 본 - 그것이 JIRA의 WSDL에서 파생 된 것

 public remoteStatusCounts(RemoteStatus r) : base(r) { //do stuff } 

내가이 개 유효한 솔루션을 상상할 수 편집 : 위에서 설명한 하나, 그리고 this 포인터의 일종 역할을 type(baseclass)이며 같은 조작 this.baseClass 같은 키워드의 일종.

 public remoteStatusCounts(RemoteStatus r) { 
      RemoteStatus mBase = r; 
      //do work 
     } 

EDIT2 : - 그래서, this.baseClass.name = "Johnny"가의가없는 baseclass가 복사 생성자가 가정하자, 모든 의도와 목적을 위해 this.name = "Johnny"

과 똑같은 일이 될 것입니다, 이것은 유효한 코드입니다 이 질문은 나의 목적을 위해서 생각보다 운동이다. 나의 목적을 위해서 나는 쉽게 이것을 할 수 있었다. (내 "기본"이 복사를 할 수 있다고 가정 할 때)

public class remoteStatusCounts 
{ 
    public int statusCount; 
    public RemoteStatus rStatus; 
    public remoteStatusCounts(RemoteStatus r) 
    { 
     rStatus = r; 
     statusCount = getStatusCount(); 
    } 
} 
+0

코드 생성이나 차라리 그 경로를 선택하지 않는 것이 좋습니다. – scaryman

+1

참고 : 클래스 이름은 대문자로 시작해야합니다. '' – Aren

답변

1

네,이 작업을 수행 할 수 있습니다. 그러나 별도로 처리해야하는 게터 전용 속성으로 실행될 수도 있습니다.

너는 Type.GetProperties(BindingsFlags) 과부하로 걸러 낼 수있다.

참고 : 리플렉션에 실행 속도와 같은 런타임 관련성이있을 수 있으므로 코드 생성을 고려해야합니다 (T4는 2008/2010과 함께 제공되므로 아이디어가 될 것입니다). 코드 생성을 사용하면이 지루한 작업을 손쉽게 처리 할 수 ​​있으며 수동으로 입력하는 것과 같은 런타임 등이 있습니다.

예 :

//extension method somewhere 
public static T Cast<T>(this object o) 
{ 
    return (T)o; 
} 

public remoteStatusCounts(RemoteStatus r) 
{ 
    Type typeR = r.GetType(); 
    Type typeThis = this.GetType(); 

    foreach (PropertyInfo p in typeR.GetProperties()) 
    { 
     PropertyInfo thisProperty = typeThis.GetProperty(p.Name); 

     MethodInfo castMethod = typeof(ExMethods).GetMethod("Cast").MakeGenericMethod(p.PropertyType); 
     var castedObject = castMethod.Invoke(null, new object[] { p.GetValue(r, null) }); 
     thisProperty.SetValue(this, castedObject, null); 
    } 
} 
+0

어떻게? 개체에 setValue를 호출 할 수 없습니다 .. this.setValue (p.Name, r.getValue)가 컴파일되지 않습니다. – scaryman

+0

물론이 경우 Type 객체를 가져와 t.GetProperty (name)로 해당 속성을 가져 와서 해당 객체에 SetValue를 수행해야합니다. – Femaref

+0

다음과 같이 컴파일됩니다. thisProperty.SetValue (this, p.GetValue (typeR, null), null); 하지만 런타임 예외가 발생합니다. "개체가 대상 유형과 일치하지 않습니다." – scaryman

2

AutoMapper을보십시오.

+0

달콤한! 전에는 들어 보지 못했습니다. - 확실히 도움이 될 것 같습니다. – scaryman