2010-12-14 6 views
4

私はリフレクトベースのオブジェクトトランスレータで作業しています。反射でネイティブオブジェクトを検出する

基本的にオブジェクトのプロパティをループし、変換されたオブジェクトの同じ名前/タイプのプロパティに値を割り当てます。

ObjectA.Name = "ジョー"

がに変換します。私は、プロパティがあるときのために、特別なケースを配置する必要があり

ObjectB.Name = "ジョー"

ObjectA.Address

などのカスタムクラスです。 210

私はPropertyTypeは

propInfo.PropertyType.IsClass 

のIsClassフラグと、このような性質を検出することができ期待していたが、このフラグはまた、文字列プロパティにtrueを返すように表示されます。

私はプロパティが非ネイティブタイプであることを確認する別の方法はありますか?

+0

文字列は値型ではありません - それは*クラスです。どのプロパティに*変更可能な*オブジェクトが含まれているかを判断しようとしているなら、それには幸運です...(また、 "ネイティブ"タイプをどう定義しますか?) – cdhowie

+3

"ネイティブタイプ" == "参照型" –

+0

「ネイティブ」という単語は、質問/タイトルから削除する必要があります。ややこしい。私が「ネイティブ」を読むとき、私はWIN32のコンストラクトを考えます。 – Amy

答えて

5

ターゲットタイプがプリミティブでないかどうかを判断したいとします。

public bool IsNotCoreType(Type type) 
{ 
    return (type != typeof(object) && Type.GetTypeCode(type) == TypeCode.Object); 
} 

どれ非プリミティブはType.GetTypeCodeの結果としてTypeCode.Objectを返す必要がありますので、我々は、我々はそれを得ることと型自体はSystem.Objectではないことを確認することができます:あなたは、おそらく、たとえば、そのためTypeCodeを使用することができます。

これはおそらく役に立ちますか?

UPDATE:私はなどStringDateTime、として両方のプリミティブおよび非プリミティブをカバーするためにIsNotCoreTypeにメソッドの名前を変更しました(下のコメントを参照してください)。

+2

' type.IsPrimitive'を使わないのはなぜですか? – cdhowie

+0

^彼はまだ 'System.String'を扱う必要があるので –

+0

@Matthew:そうだ。ただし、**はプリミティブ型ではありません。 (そして、偶然にも、どちらもオブジェクトではありません)。あなたのメソッド名はとても誤解を招きます。 – cdhowie

1

stringは参照型である.NETの唯一のプリミティブ型です。 IsClassがtrueで、型がSystem.Stringと同じでないかどうかをチェックするために、この例外をコード内で考慮する必要があります。

+0

文字列はプリミティブ型ではありません。 'csharp> typeof(string).IsPrimitive;' - > 'false' – cdhowie

関連する問題