获取属性构造函数,因为它已声明

时间:2011-04-02 19:44:20

标签: c# reflection

有没有办法确定在声明属性时使用了哪个构造函数以及传入的值?例如,如果方法标有Obsolete("message")(而不是Obsolete("message", true)),我可以检索该单个参数构造函数吗?

我问的原因是我正在进行代码生成,我希望复制在生成的类上给定方法或类上声明的属性。 GetCustomAttributes()似乎只为我提供了属性及其值的类型,但除非我遗漏的内容不足以复制实际声明属性的方式。

2 个答案:

答案 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会为您提供参数。