【问题标题】:How can I set the value of a property on a attribute on a object?如何在对象的属性上设置属性的值?
【发布时间】:2011-07-31 17:44:10
【问题描述】:

我正在尝试为类的属性设置属性值。

[FooAttr(ThePropertyIWantToSet=null)]
public class Foo
{
}

Foo theFoo = new Foo();
theFoo.SetAttributeProperty<FooAttrAttribute>("ThePropertyIWantToSet", theValueIWantToSet);

这是我写的 SetAttributeProperty 扩展方法。它编译并运行,但似乎没有设置属性。

public static void SetAttributeProperty<T>(this object instance, string fieldName, object value) where T : Attribute
{
    var attr = instance.GetType().GetCustomAttributes(typeof (T), false).FirstOrDefault();

    PropertyInfo pi = attr.GetType().GetProperty(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty);
    pi.SetValue(attr, value, null);
}

有什么我可能遗漏的想法吗?

【问题讨论】:

  • 您是否尝试为属性设置默认值?

标签: c# reflection custom-attributes


【解决方案1】:

我不知道这是否可能,但这不是属性的使用方式。我不知道关于如何以及何时创建属性实例有任何保证。例如,很有可能每次您类型或成员询问其属性时,它们都会再次从元数据中反序列化。

基本上我认为你应该在编译后将属性视为不可变,即使它们具有带有设置器的属性。

编辑:这个简短但完整的程序似乎表明Type.GetCustomAttributes 确实可以在您每次调用它时创建一个新实例:

using System;
using System.Runtime.CompilerServices;

[AttributeUsageAttribute(AttributeTargets.All)]
class FooAttribute : Attribute
{
}

[Foo]
class Bar
{
}

class Program
{
    static void Main(string[] args)
    {
        var attr = typeof(Bar).GetCustomAttributes(typeof(FooAttribute), true)[0];
        var attr2 = typeof(Bar).GetCustomAttributes(typeof(FooAttribute), true)[0];
        Console.WriteLine(attr == attr2); // Prints False
    }
}

【讨论】:

  • 可以使用 PostSharp 或其他一些可以进行某种注入的框架。
  • @Yuriy:不清楚你的意思……你是不同意我的观点还是同意我的观点?如果您不同意,您能否引用任何文档表明如果您从一个类型中检索两次相同的属性,则可以保证返回对同一对象的两个引用?
  • 从痛苦的经历中,我知道你可以得到不同的实例
  • @Marc: 刚刚想出了一个例子:)
  • @Jon 我的错,我的印象是他正在尝试做其他事情。
【解决方案2】:

在运行时这样做的唯一方法是在运行时对属性建模而不是反射。幸运的是 TypeDescriptor 已经这样做了。所以你应该发现,如果你只使用TypeDescriptor 来获取属性,那么TypeDescriptor.AddAttributes(...) 应该在运行时完成分配新属性的工作;

TypeDescriptor.AddAttributes(typeof(TargetType),
    new Attribute[] {yourAttribWithNewValue});

但是,这仅在使用该属性的代码使用 TypeDescriptor.GetAttributes(...) 时才有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多