2011-09-12 13 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

この質問は十分に明確ではありません。投稿したコード、特に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) 
    { ... } 
} 

これは反射を使用してこれを行う方法です。しかし、私のコードはあなたとは違っていることに注意してください。なぜなら、明確でないコードやコンパイルするコードを書いているということです。

ASこれはあなた

のために動作しますか、これはクラスのConstructorで発生することになっている場合、それはなります私の例のとおりにそれが機能することになっている場合

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