我想说得到以下内容:
public class A {
[MyAttribute]
public void Test() {}
}
我不喜欢添加属性以使用[]为方法或类添加前缀的行为。我认为这会使代码的可读性降低。
我发现更好的方法可能是:
AddAttribute(A, Test, MyAttribute);
有没有办法做这样的事情?
因为这是某种在运行时添加属性...
或者还有其他方法可以使用属性吗?像xml文件一样?
答案 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");
}
}