23

ここでこの問題が発生したため、リストまたはコレクションをサブクラス化し、それに追加のプロパティを追加するケースを処理するカスタム JsonConverter を作成しようとしています。したがって、1 つのアプローチは、すべての基本クラス プロパティを無視し、定義されたクラスのプロパティのみをシリアル化することです。(技術的には、そのサブクラスをサブクラス化するとシリアル化が壊れるため、これは機能しませんが、不思議に思いました...)

リフレクションを介して (Reflector が正確にそれを行うため、答えが「はい」であることはわかっていますが、方法がわかりません)、継承されたものではなく、クラス自体で定義されたメンバーのみを取得することは可能ですか? 例えば...

public class MyBaseClass
{
    public string BaseProp1 { get; set; }
    public string BaseProp2 { get; set; }
}

public class MySubClass : MyBaseClass
{
    public string SubProp1 { get; set; }
    public string SubProp2 { get; set; }
}

この場合、とを無視してMySubClassと だけを調べて取得したいと思います。それで、それはどのように行われますか?SubProp1SubProp2BaseProp1BaseProp2

M

4

4 に答える 4

35

タイプGetMembers()のメンバーを取得するためにメソッドを呼び出すときに、バインディングフラグで指定できます。DeclaredOnly

于 2011-05-04T08:51:07.540 に答える
12

のすべてのメンバーを選択し、のメンバーMySubClassのみを保持する必要がありDeclaringType == MySubClassます。

LINQでは、そのようなもの(やり過ぎ):

MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));

またはGetMembers()過負荷あり:

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
于 2011-05-04T08:52:52.123 に答える
4

多くのリフレクション関数は、BindingFlagsタイプのパラメーターを受け入れます。この列挙には、値DeclaredOnlyが含まれます。

指定されたタイプの階層のレベルで宣言されたメンバーのみを考慮する必要があることを指定します。継承されたメンバーは考慮されません。

于 2011-05-04T08:50:31.343 に答える
2

MemberInfo.DeclaringTypeあなたが必要なことをする必要があります。タイプXで直接定義されたメンバーを取得するには、メンバーをでフィルタリングしDeclaringType == typeof(X)ます。

于 2011-05-04T08:53:03.043 に答える