使用该属性的实例获取分配给Type属性的属性

时间:2013-07-09 02:34:15

标签: c# json.net

我遇到了一个问题,我需要知道一个属性是否放在一个类的属性上但是我受到限制,因为实际上我得到的是一个要使用的属性的实例(类型没用在这种情况下)。

问题来自于我正在使用自定义ContractResolver来使用json.net来检测这些属性,但是在使用ShouldSerialize谓词的情况下,从DefaultContractResolver获得的只是一个类型或实例。

我无法使用Attribute.GetCustomAttributes(type),因为该属性不在类型上。也没有运气TypeDescriptor。我在想是否有可能从该实例获取memberinfo所以我可以将其传递给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
{    
}

2 个答案:

答案 0 :(得分:0)

你是如此接近......只需从课堂上获取属性(使用反射),然后使用PropertyInfo中的GetCustomAttributes(...)。要获取应用于属性的所有属性,请使用:

MyClass obj = new MyClass();
var attList = obj.GetType()
                 .GetProperty("MyProperty")
                 .GetCustomAttributes(true);

或者如果您只想要一个特定的属性类型:'

MyClass obj = new MyClass();
var attList = obj.GetType()
                 .GetProperty("MyProperty")
                 .GetCustomAttributes(typeof(MyCustomAttribute), true);

请注意,没有应用于类的实例的属性 - 属性始终在类本身上。因此,尝试获取实例的自定义属性将毫无结果。

答案 1 :(得分:0)

正如Michael Bray所提到的那样,这是不可能的,并且它完全没有意义。

然而,为了完成我的目标,我设法做到了但不是使用我自己的marker属性然后希望使用ContractResolver覆盖,我使用了json.net属性:

[JsonConverter(typeof(SerializeOnlyWhatIWantOnThisPropertyConverter))]

通过这种方式,我们可以依靠json.net的代码继续完成其工作,同时允许我们基于每个属性,过滤掉我们想要序列化的内容。这样做的缺点是转换器的实现更加冗长且容易出错,我们无法使用ContractResolver提供的其他功能,如TypeNameHandling。我也相信ResolveContract路由更高效,因为它有内置缓存,尽管我还没有做过任何基准测试。