首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AssemblyInfo.cs中的模板化值?还是引用AssemblyInfo.cs的其他值?

AssemblyInfo.cs中的模板化值?还是引用AssemblyInfo.cs的其他值?
EN

Stack Overflow用户
提问于 2015-01-27 22:39:26
回答 2查看 1.7K关注 0票数 0

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

代码语言:javascript
复制
[assembly: AssemblyCompany("Acme Inc.")]

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

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

代码语言:javascript
复制
[assembly: AssemblyCopyright(string.Format("Copyright {$0} Acme Inc.", Acme.AssemblyInfo.FirstPublicationYear)]

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

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

代码语言:javascript
复制
namespace Acme
{
    public static class AssemblyInfo
    {
        public const int FirstPublicationYear = 2015;
    }
}

这导致错误“属性参数必须是属性参数类型的常量表达式、类型表达式或数组创建表达式”。因此,我尝试创建一个属性类:

代码语言:javascript
复制
namespace Acme
{
    using System;

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

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

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

代码语言:javascript
复制
[assembly: Acme.FirstPublicationYear(2015)]

但是,我不知道如何(或者即使可以)适当地更改共享属性文件中的AssemblyCopyright行。我试过几种没用的方法。第一:

代码语言:javascript
复制
[assembly: AssemblyCopyright(string.Format("Copyright © {$0} Acme, Inc.", Acme.FirstPublicationYear))]

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

代码语言:javascript
复制
[assembly: AssemblyCopyright(string.Format("Copyright © {$0} Acme, Inc.", [assembly: Acme.FirstPublicationYear]))]

..。它告诉我“无效的表达式‘[’‘”)。

有办法完成我在这里想做的事吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-27 22:47:56

与其使用string.Format,不如尝试连接它:

代码语言:javascript
复制
"Copyright" + Acme.AssemblyInfo.FirstPublicationYear + "Acme Inc."

编译器将能够使编译时间常量由此。

票数 1
EN

Stack Overflow用户

发布于 2015-01-27 22:50:56

没有使用代码来完成这一任务的好方法。原因是属性必须有编译时值才能正确地将数据输出到结果文件,因此无法从各个部分逻辑地构建它们,因为从定义上说,该生成是一个运行时操作,而不是编译时操作。

编辑:--即使在编译时,使用+运算符连接字符串也是可能的,只要所有被连接的字符串本身都是常量。看弗兰克的答案。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28181373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档