有没有办法确定在声明属性时使用了哪个构造函数以及传入的值?例如,如果方法标有Obsolete("message")
(而不是Obsolete("message", true)
),我可以检索该单个参数构造函数吗?
我问的原因是我正在进行代码生成,我希望复制在生成的类上给定方法或类上声明的属性。 GetCustomAttributes()
似乎只为我提供了属性及其值的类型,但除非我遗漏的内容不足以复制实际声明属性的方式。
答案 0 :(得分:3)
您是否尝试使用CustomAttributeData.GetCustomAttributes
方法获取属性构造函数的详细信息。我尝试使用一个属性来装饰一个类,它按预期工作,对于属性装饰方法等应该是相同的。
一个完整的例子:
[Obsolete("Fubar!", false)]
class Foo { }
[Obsolete("Fubar!")]
class Bar { }
static void Main(string[] args)
{
// Prints: ObsoleteAttribute(String message, Boolean error)
PrintAttributeCtorInfo(typeof(Foo));
// Prints: ObsoleteAttribute(String message)
PrintAttributeCtorInfo(typeof(Bar));
}
private static void PrintAttributeCtorInfo(Type type)
{
foreach (var item in CustomAttributeData.GetCustomAttributes(type))
{
var parameters = item.Constructor.GetParameters();
string paramsList = String.Join(
", ",
parameters.Select(pi => pi.ParameterType.Name + " " + pi.Name));
Console.WriteLine(
"{0}({1})",
item.Constructor.DeclaringType.Name,
paramsList);
}
}
另外,我并不完全确定这一点,但我相信安全属性有点特殊,因此可能无法发现所使用的确切构造函数。但是,我似乎无法回忆起我从哪里得到这个想法,所以不要把它视为理所当然。
答案 1 :(得分:0)
要确定使用哪个构造函数,您需要查看IL代码。
如果我没记错的话,你会发现自定义属性被声明为对构造函数方法的调用。解析ConstructorInfo
会为您提供参数。