如何在C#中使用反射获取方法的所有属性和属性数据

时间:2015-03-26 00:54:39

标签: c# reflection

最终目标是复制属性"按原样#34;从一个方法到生成的类中的另一个方法。

public class MyOriginalClass
{
    [Attribute1]
    [Attribute2("value of attribute 2")]
    void MyMethod(){}
}

public class MyGeneratedClass
{
    [Attribute1]
    [Attribute2("value of attribute 2")]
    void MyGeneratedMethod(){}
}

我能够使用MethodInfo.GetCustomAttributes()列出方法的属性,但是,这并没有给我属性参数;我需要在生成的类上生成相应的属性。

请注意,我不知道属性的类型(无法转换属性)。

我正在使用CodeDom生成代码。

2 个答案:

答案 0 :(得分:4)

MethodInfo.GetCustomAttributesData()包含所需信息:

// method is the MethodInfo reference
// member is CodeMemberMethod (CodeDom) used to generate the output method; 
foreach (CustomAttributeData attributeData in method.GetCustomAttributesData())
{
    var arguments = new List<CodeAttributeArgument>();
    foreach (var argument in attributeData.ConstructorArguments)
    {
        arguments.Add(new CodeAttributeArgument(new CodeSnippetExpression(argument.ToString())));
    }

    if (attributeData.NamedArguments != null)
        foreach (var argument in attributeData.NamedArguments)
        {
            arguments.Add(new CodeAttributeArgument(new CodeSnippetExpression(argument.ToString())));
        }

    member.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(attributeData.AttributeType), arguments.ToArray()));
}

答案 1 :(得分:1)

我不知道如何做到这一点。 GetCustomAttributes返回一个对象数组,每个对象都是一个自定义属性的实例。无法知道哪个构造函数用于创建该实例,因此无法知道如何为这样的构造函数创建代码(这是属性语法所代表的)。

例如,你可能有:

[Attribute2("value of attribute 2")]
void MyMethod(){}

Attribute2可以定义为:

public class Attribute2 : Attribute {
    public Attribute2(string value) { }
    public Attribute2() {}
    public string Value{get;set;}
}

无法知道它是否由

生成
[Attribute2("value of attribute 2")]

[Attribute2(Value="value of attribute 2")]