【发布时间】:2011-01-11 06:06:52
【问题描述】:
我正在 C# 中创建一个custom attribute,我想根据属性是应用于方法还是应用于属性来做不同的事情。起初我打算在我的自定义属性构造函数中执行new StackTrace().GetFrame(1).GetMethod() 以查看调用属性构造函数的方法,但现在我不确定这会给我带来什么。如果将属性应用于属性会怎样? GetMethod() 会为该属性返回 MethodBase 实例吗?在 C# 中获取应用属性的成员是否有不同的方法?
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property,
AllowMultiple = true)]
public class MyCustomAttribute : Attribute
更新:好吧,我可能问错了问题。从自定义属性类中,如何获取应用了我的自定义属性的成员(或包含该成员的类)? Aaronaught 建议不要在堆栈中查找应用了我的属性的类成员,但是我如何从属性的构造函数中获取这些信息?
【问题讨论】:
-
不想听起来不好,但我不得不问你为什么要找出你的方法应用了什么属性?这是一种强烈的设计气味。也许你应该问问这样做的动机是什么。
-
您是否考虑过如果您依赖于调用方法的属性,解决方案会变得多么脆弱?所需要的只是某人决定从该方法中重构一些通用代码以破坏它,并且它们可能与您的运行时检查相去甚远,以至于他们不知道为什么它会破坏并且无法弄清楚它出去。除非你正在编写自己的 DI/AOP 框架,否则我觉得这很可怕......
-
回答您的更新:您不能。属性不包含有关它们所应用的类型的任何信息;他们反过来工作。通常你只会知道一个属性,因为你是从成员的(属性或方法)
GetCustomAttribute[s]方法中获取的。 -
从我这里添加另一个“无法从这里到达”。
-
是的 - 我也被卡住了,虽然我不同意想要检测属性的目标是糟糕的设计。考虑一个DescriptionAttribute 的示例,它被子类化以返回一个文化敏感的资源字符串。理想情况下,资源键将源自应用了 DescriptionAttribute 的属性/成员的名称。如果无法检测到目标,属性就无法实现这一点。
标签: c# reflection attributes custom-errors