属性值不反映在运行时

时间:2018-04-10 11:32:58

标签: c# custom-attributes

我遇到了问题,无法解决这个问题: 我创建了一个mathode,它应该设置特定属性的属性值" MappingAttribute"并返回新对象。

问题: 属性值始终设置为默认值" false"。 我哪里错了?

    static public T MapToClass<T>(SqlDataReader reader) where T : class
    {
        T returnedObject = Activator.CreateInstance<T>();
        PropertyInfo[] modelProperties = returnedObject.GetType().GetProperties();
        for (int i = 0; i < modelProperties.Length; i++)
        {
            MappingAttribute[] attributes = modelProperties[i].GetCustomAttributes<MappingAttribute>(true).ToArray();


            if (attributes.Length > 0) {
                attributes[0].AutoIncrement = true;
                attributes[0].Primekey = true;
            }
        }
        return returnedObject;
    }

1 个答案:

答案 0 :(得分:2)

除了程序集元数据之外,

属性不会存储。当通过反射要求时,它们仅实现为属性实例 - 在您的情况下通过GetCustomAttributes<MappingAttribute>。但是:你丢弃了这些。下次调用GetCustomAttributes<MappingAttribute>时,将分发新实例,其中包含程序集元数据中的值。

基本上:更新属性实例的属性意味着当代码询问属性元数据时,其他代码会看到这些更改。

为了说明这一点:

using System;
class FooAttribute : Attribute { public string Value { get; set; } }

[Foo(Value = "abc")]
class Bar
{
    static void Main()
    {
        var attrib = (FooAttribute)typeof(Bar)
            .GetCustomAttributes(typeof(FooAttribute), false)[0];
        Console.WriteLine(attrib.Value); // "abc"
        attrib.Value = "def";
        Console.WriteLine(attrib.Value); // "def"

        // now re-fetch
        attrib = (FooAttribute)typeof(Bar)
            .GetCustomAttributes(typeof(FooAttribute), false)[0];
        Console.WriteLine(attrib.Value); // "abc"
    }
}