用mono.cecil或postsharp替换Attribute构造函数参数

时间:2014-02-25 08:08:20

标签: c# postsharp mono.cecil

我有一个示例方法定义:

[FooAttribute("One","time")]
public void Bar(){}

是否可以通过上述技术之一将参数“一”更改为“两个”?

1 个答案:

答案 0 :(得分:2)

假设以下属性和类:

public class MyAttribute : Attribute
{
    public MyAttribute(string a, string b)
    {
        this.a = a;
        this.b = b;
    }
    private string a,b;
}

[My("foo", "bar")]
class WithAttribute
{
}

你可以使用类似下面的一些代码(请记住,这段代码仅用于演示目的,它假定了很多东西并且根本没有错误处理)

var assembly = AssemblyDefinition.ReadAssembly(assemblyPath);
var type = assembly.MainModule.Types.Where(t => t.Name.Contains("WithAttribute")).Single();

var attr = type.CustomAttributes.Where(ca => ca.AttributeType.FullName.Contains("MyAttribute")).Single();

type.CustomAttributes.Remove(attr);

var newAttr = new CustomAttribute(attr.Constructor)
{ 
    ConstructorArguments = 
    {
        new CustomAttributeArgument(
             attr.ConstructorArguments[0].Type, 
             attr.ConstructorArguments[0].Value + "-Appended"),

        new CustomAttributeArgument(
             attr.ConstructorArguments[1].Type, 
             attr.ConstructorArguments[1].Value)
     }
};

type.CustomAttributes.Add(newAttr);

assembly.Write(path);