2013-01-19 3 views
3

내 클래스의 필드를 순환 시키려고 시도하고 특정 유형의 필드를 목록에 배치 한 다음 해당 목록을 반환합니다. 나는 핵심 구성 요소가 빠져 있음을 알고 있지만, 내가 뭘 잘못하고 있는지 알 수 없다.클래스의 모든 필드를 반환

...

내가 포인터로 실제 필드의 목록을 반환 데이터의 복사본이 아닌 필요 : 이것은 내가 지금까지있는 것입니다. 이 일을하기위한 도움을 주시면 감사하겠습니다.

혼란을 겪었으므로 위 코드를 삭제했습니다 (기록에서 볼 수 있어야합니다).

string prop1; 
BaseClass prop2; 
SubClass prop3; 
SubClass prop4; 

public List<BaseClass> GetData() 
{ 
    List<BaseClass> DataList = new List<BaseClass>(); 

    foreach (System.Reflection.PropertyInfo thisInfo in this.GetType().GetProperties()) 
    { 
     var tempPropery = thisInfo.GetValue(this, null); 
     if (tempPropery.GetType().IsSubclassOf(typeof(BaseClass)) || tempPropery.GetType().Equals(typeof(BaseClass))) 
     { 
      DataList.Add((BaseClass)tempPropery); 
     }; 
    } 

    return DataList; 
} 

은 위의 코드는 당신이 당신의 클래스에서 특정 기본 형식의 모든 속성을 얻고 그들을 반환 할 수 있습니다 :이 competent_tech에서 답 덕분에 작동 (제거 몇 가지 여분의 물건) 업데이트 된 코드입니다 목록에. 따라서 위의 코드는 prop2 - prop4를 반환합니다.

+1

나는'사전 <문자열을 사용합니다 : 당신은 필드와 속성을 모두보고있는 경우, 또는

 foreach (System.Reflection.PropertyInfo oProperty in this.GetType().GetProperties()) { Console.WriteLine(oProperty.Name + " = " + oProperty.GetValue(this, null).ToString()); } 

:

당신이 PropertyInfo이 있으면, 당신은을 getValue 메소드를 호출 할 수 , PrimaryAbility> 대신에. 그러면'STR '을 다음과 같이 얻을 수 있습니다 :'var str = AllAbilities [ "STR"];'. 리플렉션이 필요한 경우는 종종 코드를 리팩터링해야 함을 나타냅니다. –

+0

나는 뭔가 새로운 것을 추가 할 때마다 여분의 코드 줄을 추가하는 것보다 모든 능력을 돌려주는 (그리고 다른 클래스들은 같은 구조를 사용하는) 쉬운 (그러나 처음에는 복잡한) 방법을 찾고있다. –

답변

2

리플렉션을 통해이를 수행 할 수 있습니다.

foreach (System.Reflection.PropertyInfo oProperty in this.GetType().GetProperties()) { 
} 

당신은 당신이 그것을 일단이 정보를 사용하거나 (예를 들어, 수집 할 속성에 속성을 추가하여) 속성을 필터링 할 수 있습니다 여러 가지 방법이 있습니다.

자세한 내용은 from MSDN을 참조하십시오.

이 코드는 속성을 구체적으로 나타내지 만 필드 (GetFields)와 모든 멤버 (GetMembers)를 검색하는 동일한 방법이 있습니다.

 foreach (System.Reflection.MemberInfo oMember in this.GetType().GetMembers()) 
     { 
      switch (oMember.MemberType) 
      { 
       case System.Reflection.MemberTypes.Field: 
        var oField = (System.Reflection.FieldInfo)oMember; 
        Console.WriteLine(oField.Name + " = " + oField.GetValue(this).ToString()); 
        break; 

       case System.Reflection.MemberTypes.Property: 
        var oProperty = (System.Reflection.PropertyInfo)oMember; 
        Console.WriteLine(oProperty.Name + " = " + oProperty.GetValue(this, null).ToString()); 
        break; 

      } 
     } 
+0

나 이것을 사용하는 방법에 대한 추가 설명이 필요합니다. 이것은 기본적으로 내 라인과 같습니다 :'var tempList = this.GetType(). GetMembers();'- 정보를 얻은 후에 필드를 추출하는 방법을 모르겠습니다. –

+1

죄송합니다. 두 가지 경우 모두 이름과 값을 검색 할 수 있도록 답변을 업데이트했습니다. –

+0

완벽한 감사합니다 !!! 정확히 내가 필요로하는 것. –

0

사전에 데이터를 저장할 수 있습니다. 모든 속성에 대해서만 사전에서 값을 설정/가져옵니다. 이 같은 뭔가 :

public class MyData { 
    private Dictionary<string, object> myData; 
    public MyData { 
     this.myData = new Dictionary<string, object>(); 
    } 

    public decimal LastVersion { get { return (decimal)this.myData["LastVersion"]; } private set { this.myData["LastVersion"] = value; } } 

    public PrimaryAbility STR { get { return (PrimaryAbility)this.myData["STR"]; } private set { this.myData["STR"] = value; } } 
    public PrimaryAbility DEX { get { return (PrimaryAbility)this.myData["DEX"]; } private set { this.myData["DEX"] = value; } } 
    public PrimaryAbility CON { get { return (PrimaryAbility)this.myData["CON"]; } private set { this.myData["CON"] = value; } } 
    public PrimaryAbility INT { get { return (PrimaryAbility)this.myData["INT"]; } private set { this.myData["INT"] = value; } } 
    public PrimaryAbility WIS { get { return (PrimaryAbility)this.myData["WIS"]; } private set { this.myData["WIS"] = value; } } 
    public PrimaryAbility CHA { get { return (PrimaryAbility)this.myData["CHA"]; } private set { this.myData["CHA"] = value; } } 

    public DerivedAbility HP { get { return (DerivedAbility)this.myData["HP"]; } private set { this.myData["HP"] = value; } } 
    public DerivedAbility MP { get { return (DerivedAbility)this.myData["MP"]; } private set { this.myData["MP"] = value; } } 
    public DerivedAbility SP { get { return (DerivedAbility)this.myData["SP"]; } private set { this.myData["SP"] = value; } } 
    public DerivedAbility AC { get { return (DerivedAbility)this.myData["AC"]; } private set { this.myData["AC"] = value; } } 
} 

내가 이걸 발견 언젠가 "Enum.GetValues ​​(대해서 typeof (TvStations))", 어쩌면이 같은 몇 가지를 검색합니다.

관련 문제