属性がクラスのプロパティに配置されているかどうかを知る必要があるという問題に遭遇しましたが、実際に取得したのはそのプロパティのインスタンスだけであるため、制限されています(このシナリオでは型は役に立ちません) )。
この問題は、カスタムの ContractResolver を使用して json.net を使用してそのような属性を検出しているという事実に起因しますが、ShouldSerialize 述語を使用する場合、DefaultContractResolver から取得できるのは型またはインスタンスだけです。
属性が型にないため、Attribute.GetCustomAttributes(type) を使用できません。TypeDescriptor でも運がなかった。そのインスタンスからメンバー情報を取得できるかどうかを考えているので、それを GetCustomAttributes に渡すことができますが、これは可能ですか? 他の方法はありますか?
ところで、私が達成したいのは、一部のプロパティにマーカー属性を配置して、契約リゾルバーがそのタイプのすべてではなく一部のプロパティのみをシリアル化できるようにすることです。オブジェクト全体をシリアル化したい場合があるため、これを型自体に付けたくありません。また、タイプごとにコントラクト リゾルバーを作成するのも現実的ではありません。
var instance = new MyClass();
instance.MyProperty = new OtherClass();
// propertyValue is all I get when I'm on the ShouldSerializeMethod
object propertyInstance = instance.MyProperty;
var attributes = Attribute.GetCustomAttributes(propertyInstance.GetType());
// this returns no attributes since the attribute is not on the type but on the property of another type
Console.WriteLine (attributes.Length);
public class MyClass
{
[MyCustomAttribute]
public OtherClass MyProperty { get; set; }
}
public class OtherClass
{
public string Name { get; set; }
}
public class MyCustomAttribute : Attribute
{
}