【问题标题】:Templatized values in AssemblyInfo.cs? Or referring to other values from AssemblyInfo.cs?AssemblyInfo.cs 中的模板化值?或者引用 AssemblyInfo.cs 中的其他值?
【发布时间】:2015-01-27 22:39:26
【问题描述】:

我有几个 C# 项目在某种意义上是一个单元。有几个常见的 AssemblyInfo 属性可以在它们之间共享(例如公司名称)。所以我制作了一个所有项目都包含的共享文件,包含(例如)AssemblyCompany:

[assembly: AssemblyCompany("Acme Inc.")]

我从每个项目的单个 AssemblyInfo.cs 中删除了相应的属性。

这一切都很好,但我想在一个案例中更进一步:版权。出版的第一年因项目而异,因此它们确实应该具有不同的版权字符串。所以我想在共享文件中做这样的事情:

[assembly: AssemblyCopyright(string.Format("Copyright {$0} Acme Inc.", Acme.AssemblyInfo.FirstPublicationYear)]

然后让每个单独的项目定义自己特定的Acme.AssemblyInfo.FirstPublicationYear

我在黑暗中拍摄了几张不同的照片。首先,我只是尝试在项目的 AssemblyInfo.cs 中的静态类中定义一个 const:

namespace Acme
{
    public static class AssemblyInfo
    {
        public const int FirstPublicationYear = 2015;
    }
}

这会导致错误“属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式”。所以我尝试制作一个属性类:

namespace Acme
{
    using System;

    [AttributeUsage(AttributeTargets.Assembly)]
    public class FirstPublicationYearAttribute : Attribute
    {
        private int year;

        public FirstPublicationYearAttribute(int year)
        {
            this.year = year;
        }
    }
}

将该属性添加到单个项目的 AssemblyInfo.cs:

[assembly: Acme.FirstPublicationYear(2015)]

但我不确定如何(或者即使我可以)适当地更改共享属性文件中的AssemblyCopyright 行。我尝试了几种没有奏效的方法。第一:

[assembly: AssemblyCopyright(string.Format("Copyright © {$0} Acme, Inc.", Acme.FirstPublicationYear))]

...告诉我FirstPublicationYear 不存在于命名空间Acme 中。所以我想也许我会让它看起来更像一个属性:

[assembly: AssemblyCopyright(string.Format("Copyright © {$0} Acme, Inc.", [assembly: Acme.FirstPublicationYear]))]

...它告诉我“无效的表达式术语'['”。

有没有办法完成我在这里尝试做的事情?谢谢。

【问题讨论】:

    标签: c# templates assemblyinfo


    【解决方案1】:

    不要使用string.Format,而是尝试连接它:

    "Copyright" + Acme.AssemblyInfo.FirstPublicationYear + "Acme Inc."
    

    编译器将能够由此生成编译时间常数。

    【讨论】:

    • 请注意,当且仅当使用的变量本身是consts时,这才有效
    • 谢谢,但你确定吗?也许我做错了什么,但我仍然收到错误“属性参数必须是属性参数类型的常量表达式、类型表达式或数组创建表达式”。
    • 哦,我明白了:将FirstPublicationYear 定义为int 导致了问题;将其更改为 string 使其工作正常。再次感谢!
    【解决方案2】:

    没有很好的方法使用代码。原因是属性 必须 具有编译时值才能将数据正确输出到结果文件,因此无法从部分逻辑上构建它们,因为根据定义,构建是运行-时间,而不是编译时间,操作。

    编辑: 使用+ 运算符连接字符串确实是可能的,即使在编译时,只要所有被连接的字符串本身都是常量。请参阅弗兰克的回答。

    但是,由于所有这些值都来自一个单个共享文件,因此可以通过编写预构建批处理文件来实现。就生产代码而言,我已将其实现为预构建步骤中的一个简单调用,所述帮助程序是用 C# 编写的。只要 output 文件(通常是 AssemblyInfo.cs)被您的 repo 忽略(如果您不使用 repo,请切换到一个),您就可以依赖该文件由预构建生成,然后由编译器找到,即使它实际上并没有被复制下来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      相关资源
      最近更新 更多