2016-08-09 2 views
-3

조직에 중첩 된 클래스를 사용하는 다음 데이터 구조에 일부 구성이 저장되어 있습니다.Reflection을 사용하여 중첩 클래스의 정적 속성을 읽는 방법?

public abstract class LogoSpec 
{ 
    public abstract byte[] Logo { get; set; } 

    public class Web 
    { 
     public static float Height { get; set; } 

     public class A4 : Web 
     { 
      public static float Left { get; set; } 
     } 
    } 
} 

public class SampleLogo : LogoSpec 
{ 
    public override byte[] Logo { get; set; } 
} 
내가 정확히

// Setting values 
SampleLogo.Web.A4.Height = 10.25f; 

이 어떻게 런타임에이 값을 검색하는 기능을 쓸 수있는 디자인 타임에 사용 할 값을 알고있을 때

나는 쉽게 사용할 수 있습니까?

float GetValue(string logoName = "SampleLogo", string layout = "Web", string paperSize = "A4", string property = "Height"); 
+2

이미 리플렉션을 통해 해당 값을 얻으려고 했습니까? 그렇다면 어떤 특정 문제가 발생 했습니까? 그렇지 않다면 그렇게하십시오. – csmckelvey

+0

의심의 여지가 있기 때문에 시나리오에 대한 답변을 이미 웹에서 검색하고 스택 오버플로를 수행했으며, 목표를 달성하기 위해 이미 코드를 구현하려고 시도했지만 어떤 이유로 든 가져올 수 없다고 가정합니다 일하다. 비록 그러한 관대 한 가정을 다 만들지 만, 나는 여전히 위의 질문이 효과가 있다는 것을 발견합니다. 이것은 모든 것을 보여주는 좋은 [mcve]뿐만 아니라 당신이 어려움에 처한 어려움에 대한 어떤 종류의 묘사도 부족하기 때문입니다. –

+0

시도한 GetNestedTypes()하지만 기본 형식에서 오는 경우 중첩 형식을 반환하지 않습니다. Reflection에서 내가 무엇을 쓸 수 있는지 모르겠다. – Raj

답변

1

해당 속성을 얻을 수있는 방법은 매우 정직하고 사실이지만, 당신이 필요한 모든 BindingFlags 제공해야합니다 :

PropertyInfo p = typeof(SampleLogo.Web.A4).GetProperty("Height", 
    BindingFlags.Static | 
    BindingFlags.FlattenHierarchy | 
    BindingFlags.Public); 

FlattenHierarchy도 기본 클래스의 속성을 얻기 위해 필요합니다.

이제 당신은 얻을이 PropertyInfo를 사용하여 값을 설정할 수 있습니다

p.SetValue(null, 14f); 
float height = (float)p.GetValue(null); 

업데이트 : 완전한 방법은 다음과 같을 수 있습니다 :

public float GetValue(string logoName = "LogoSpec", string layout = "Web", string paperSize = "A4", string property = "Height") 
{ 
    Type logoType = Type.GetType(logoName); 
    Type layoutType = logoType?.GetNestedType(layout); 
    Type paperType = layoutType?.GetNestedType(paperSize); 
    PropertyInfo pi = paperType?.GetProperty("Height", BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Public); 
    return (float?)pi?.GetValue(null) ?? 0f; 
} 

을하지만 "LogoSpec" 대신 점에 유의 AssemblyQualifiedName을 사용하거나 최소한 네임 스페이스로 유형 이름을 한정해야합니다.

+0

감사. 내가 사용하지 않은 것이 FlattenHierarchy였습니다. – Raj

+0

@Raj 좋아, 어쨌든 방법을 추가, 나는 이것이 어떻게 작동하는지 스스로 궁금해서. –

관련 문제