2011-09-12 2 views
5

나는 C#의 반사 개념을 배우고 있습니다. 이 클래스가 있습니다.간단한 질문 : C#의 반사

public class pdfClass 
{ 
    public List<AttributeProperties> TopA { get; set; } 
    public List<AttributeProperties> TopB { get; set; } 
    public List<AttributeProperties> TopC { get; set; } 

} 

다른 클래스에서 목록에서 값을 추출하고 싶습니다. 나는 그것을하기 위해 어리석은 방법을 가지고있다.

public void ExtractValue (pdfClass incomingpdfClass, string type) 
{ 
switch (type) 
{ 
    case "TopA": 
    foreach (var listitem in incomingPdfClass.TopA) 
    {...} 
    breaks; 
    case "TopB": 
    foreach (var listitem in incomingPdfClass.TopB) 
    {...} 
    breaks; 
    ... 
} 
} 

foreach 루프의 연산은 비슷하다. 어떻게 반사를 사용하여 명확한 방법으로이 작업을 수행 할 수 있습니까?

+2

은 왜 이것에 대한 반사를 사용하는 것처럼 사용 나는 그런 사전을 지속하여 전략 자체에서 유형을 분리하는 것이 좋습니다 것입니다 ? –

+2

이 질문은 명확하지 않습니다. 게시 한 코드, 특히 두 번째 예제는 컴파일되지 않습니다 (switch 문은 클래스에있을 수 없습니다). ExtractValue 클래스에서 TopA, TopB 등의 속성에 대한 참조를 얻는 방법은 무엇입니까? pdfClass에서 상속합니까? 우리는 더 좋은 모범이 필요합니다. –

+0

@Seen : 당신은 pdfClass의 인스턴스를 가지고 있습니까? – sll

답변

7
public void ExtractValue(pdfClass incomingpdfClass, string type) 
{ 
    PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type); 
    var yourList = pinfo.GetValue(incomingpdfClass); 
    foreach (var listitem in yourList) 
    { ... } 
} 

이것은 리플렉션을 사용하여 수행해야합니다. 그러나 명확하지 않은 코드를 작성하거나 컴파일하지 않는다는 점에서 내 코드와 다른 코드가 있음을 알아야합니다. 그이가 보이게해야하는 클래스의 Constructor에서 일어날 것으로 예상되는 경우이 당신

작동 또는 것입니다 내 예에 따라 함수가 될 것으로 예상되는 경우

AS
public class ExtractValue (pdfClass incomingpdfClass, string type) 

가 아닌 유효한 C#을 구문입니다

public class ExtractValue 
{ 
    public ExtractValue(pdfClass incomingpdfClass, string type) 
    { 
    PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type); 
    var yourList = pinfo.GetValue(incomingpdfClass); 
    foreach (var listitem in yourList) 
    { ... } 
    } 
} 
+0

답변 해 주셔서 감사합니다 ... 제 질문 문에서 더 명확하게하려고 노력했습니다. – Seen

+0

@Seen 당신의 코드는 여전히 유효하지 않지만 도움을주기 위해 나의 예를 확장 중입니다 – msarchet

+0

고맙습니다 .... 오랫동안 stackoverflow에 게시하지 않았고 어리석은 실수를 많이했습니다. – Seen

1
var property = this.GetType().GetProperty(type); 
foreach (var item in (List<AttributeProperties>)property.GetValue(this, null)) 
{ 

} 
1

당신이 pdfClass의 인스턴스가있는 경우 목록에 액세스하기위한 반사를 사용할 필요가 없습니다를 다음과 같이.

IDictionary<string, Func<pdfClass, AttributeProperties, bool>> strategy; 

일단

strategy.Add("TopA", (pdf, item) => 
       { 
       return pdf.TopA.IndexOf(item) >= 0; 
       }); 

같은 관계를 추가하고

string itemType = "TopA"; 
if (strategy.ContainsKey(itemType)) 
{ 
    bool found = strategy[itemType](incommingPdfClass, listItem); 
} 
+0

고마워요! 나는 나중에이 방법을 시도 할 것이다. – Seen

+0

@Seen : 질문이있는 경우 여기에서 소리 치십시오. – sll