我可以将属性应用于命名空间的所有成员吗?

时间:2014-11-11 21:24:38

标签: c# attributes

我需要将属性(与模糊相关)应用于某个命名空间中的所有类。我目前正在完成清单并手工完成,但我更愿意以自动应用的方式进行。这样可以节省一些工作,但也可以确保将来添加到此命名空间的类也具有该属性。

C#是否有这些方面的规定?

1 个答案:

答案 0 :(得分:1)

我不知道.Net中有任何可以做到的内置工具,但你可以使用Mono.Cecil轻松自己编写一个这里是一个可以在指定类型中注入指定属性的方法。

    private static void InjectAttribute<T>(string source,string destination,string nameSpace="")where T:Attribute
    {
        var assembly = AssemblyDefinition.ReadAssembly(source);
        var module = assembly.MainModule;
        var types = module.GetTypes();


        var attributeConstructor = module.Import(typeof (T).GetConstructor(Type.EmptyTypes));

        foreach (var type in types)
        {
            if (type.FullName.StartsWith(nameSpace))
                type.CustomAttributes.Add(new CustomAttribute(attributeConstructor));
        }

        assembly.Write(destination);
    }

以下是一个示例注入器程序:(注意:我从我的注入器程序中引用了Obfuscate库,因此无需解析Cecil的类型)

    private static void Main(string[] args)
    {
        //NOTE:obfuscatelib is already referenced to injector so no need to resolve types
        InjectAttribute<ObfuscationLib.ObfuscateAttribute>(@"assembly path",
            @"injected assembly path","namespace (based on full name)");
    }

您可以通过PM> Install-Package Mono.Cecil Nuget命令获取Mono.Cecil。