.NET MemberInfo.GetCustomAttributes不适用于类的属性!

时间:2011-01-20 13:21:37

标签: .net serialization

我创建了一个自定义属性&在我班级的属性(不是字段)中使用它。

当我调用FormatterServices.GetSerializableMembers时,它确实给了我所有的属性

但是当我尝试使用MemberInfo.GetCustomAttributes读取属性时,它并没有给我任何价值。

当我尝试使用object.GetType()。GetProperties()。GetCustomAttributes,它完美地工作时,实现相同的效果。

知道为什么它没有在MemberInfo中提供信息吗?

[AttributeUsage(AttributeTargets.Property)]
public class MyAttribute : Attribute { }

//DOES NOT WORK
MemberInfo[] members = FormatterServices.GetSerializableMembers(recordObject.GetType());
object[] attributes = members[0].GetCustomAttributes(typeof(MyAttribute), false)

//WORKS
PropertyInfo[] properties = recordObject.GetType().GetProperties();
object[] attributes = properties[0].GetCustomAttributes(typeof(MyAttribute), false);

2 个答案:

答案 0 :(得分:2)

FormatterServices.GetSerializableMembers不返回任何属性,而是返回可序列化类的字段。

例如,以下示例类:

    [Serializable]
    public class TestClass
    {
        private int _test;

        [MyAttribute]
        public int Test
        {
            get { return _test; }
            set { _test = value; }
        }
    }

FormatterServices.GetSerializableMembers使用MemberInfo _test字段,但GetType()。GetProperties()返回属性MemberInfo

因为字段本身没有附加任何属性,因此GetCustomAttributes不会返回任何内容。

答案 1 :(得分:1)

最有可能的是,第一个成员返回

FormatterServices.GetSerializableMembers(recordObject.GetType());

实际上并不是您所期望的财产。