2011-02-01 13 views
3

C#プログラムで実行時にオブジェクトの値を取得しようとすると、「オブジェクトがターゲットタイプと一致しません」というメッセージが表示されます。 、姓と名(簡略化のため、すべての文字列) -PropertyInfo再帰中のGetValueスローエラー

public void GetMyProperties(object obj) 
{ 
    foreach(PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
    if(!Helper.IsCustomType(pinfo.PropertyType)) 
    { 
     string s = pinfo.GetValue(obj, null); //throws error during recursion call 
     propArray.Add(s); 
    } 
    else 
    { 
     object o = pinfo.PropertyType; 
     GetMyProperties(o); 
    } 
    } 
} 

私はこれにより、次にプロパティを持つタイプのブローカーの一つの特性を持っている私のクラスBrokerInfoのオブジェクトを渡します。

- BrokerInfo 
    - Broker 
    - FirstName 
    - LastName 

カスタム型を再帰的にチェックして値を取得しようとしています。私は次のようなことをすることができます:

- Broker 
    - FirstName 
    - LastName 

助けてください。

更新:leppieの助けを借りて解決できました:ここに修正コードがあります。

public void GetMyProperties(object obj) 
{ 
    foreach(PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
    if(!Helper.IsCustomType(pinfo.PropertyType)) 
    { 
     string s = pinfo.GetValue(obj, null); 
     propArray.Add(s); 
    } 
    else 
    { 
     object o = pinfo.GetValue(obj, null); 
     GetMyProperties(o); 
    } 
    } 
} 

IsCustomは、タイプがカスタネットタイプかどうかを確認する方法です。コードは次のとおりです。

public static bool IsCustomType(Type type) 
{ 
    //Check for premitive, enum and string 
    if (!type.IsPrimitive && !type.IsEnum && type != typeof(string)) 
    { 
     return true; 
    } 
    return false; 
} 
+0

具体的にここに:

object o = pinfo.PropertyType; GetMyProperties(o); 

それはのようなものになるはずですか? –

+0

コードを追加しました。 –

答えて

5

なぜインスタンスではなくタイプをドリルダウンしていますか?あなたは `Helper.IsCustomType`のコードを投稿してくださいすることができ

var o = pinfo.GetValue(obj, null); 
    GetMyProperties(o); 
+0

@thanks leppie、私は間違ってやっていたと思う:)すぐにこれを試してみる。 –

+0

レッピー、完璧な解決策。私は上で動作する変更されたコードを投稿しました。今はもう別の問題を抱えていますが、それを別々に掲示します。ありがとう! –