我遇到了问题,无法解决这个问题: 我创建了一个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;
}
答案 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"
}
}