C# - 使用属性的替代方法

时间:2010-12-02 13:35:19

标签: c# .net reflection .net-4.0 attributes

我想说得到以下内容:

public class A {
     [MyAttribute]
     public void Test() {}
}

我不喜欢添加属性以使用[]为方法或类添加前缀的行为。我认为这会使代码的可读性降低。

我发现更好的方法可能是:

AddAttribute(A, Test, MyAttribute);

有没有办法做这样的事情?

因为这是某种在运行时添加属性...

或者还有其他方法可以使用属性吗?像xml文件一样?

3 个答案:

答案 0 :(得分:5)

属性不能在运行时添加,它们嵌入在程序集的元数据中。但是,您可以在构建期间使用外部工具添加属性,以便在编译之前修改源代码。

答案 1 :(得分:1)

不,没有替换属性的通用解决方案。

但是,还有其他方法可以实现属性提供的内容。这实际上取决于您使用的框架。

答案 2 :(得分:0)

这取决于具体情况;对于某些场景,实际可以在运行时添加属性 - 但它们只显示在TypeDescriptor下(这是大多数UI数据绑定使用的),以及<强烈>不原始反思。

例如,用于注释类型

TypeDescriptor.AddAttributes(typeof(Foo),
    new TypeConverterAttribute(typeof(ExpandableObjectConverter)));

在运行时替换类型转换器

您也可以使用属性做一些技巧,但它是很多模式......时髦。

一般情况;只需使用代码属性。关于属性没有什么本质上是不可读的,并且它们的位置高亮显示它们是元数据 - 关于类型/方法,但实际上并不是类型/方法本身的一部分。


以下仅供讨论;我不会这样做只是因为你不喜欢它的外观(虽然我做了类似的事情来帮助注释机器生成的代码):

档案1

[Description("evil evil evil")]
partial class Foo {
    [Description("don't do this")]
    partial void Bar();
}

文件2

partial class Foo {
    partial void Bar() {
        Console.WriteLine("I can only be called from inside the type; "
           + "I can't be public");
    }
}