用C#获取程序集描述的简化方法?

用C#获取程序集描述的简化方法?,c#,linq,reflection,.net-4.0,lambda,C#,Linq,Reflection,.net 4.0,Lambda,我在阅读一本.NET 2.0书籍时,偶然发现了以下示例代码,其中包含应用程序程序集描述: static void Main(string[] args) { Assembly assembly = Assembly.GetExecutingAssembly(); object[] attributes = assembly.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);

我在阅读一本.NET 2.0书籍时,偶然发现了以下示例代码,其中包含应用程序程序集描述:

static void Main(string[] args)
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    object[] attributes = 
        assembly.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
    if (attributes.Length > 0)
    {
        AssemblyDescriptionAttribute descriptionAttribute =
            (AssemblyDescriptionAttribute)attributes[0];
        Console.WriteLine(descriptionAttribute.Description);
    }
    Console.ReadKey();
}

简单地获取程序集描述需要大量代码,我想知道在.NET 3.5+中是否有更简单的方法使用LINQ或lambda表达式来实现这一点?

实际上没有。你可以像这样让它更流畅一点:

 var descriptionAttribute = assembly
         .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
         .OfType<AssemblyDescriptionAttribute>()
         .FirstOrDefault();

 if (descriptionAttribute != null) 
     Console.WriteLine(descriptionAttribute.Description);
public static class AssemblyExtensions
{
    public static string GetDescription(this Assembly assembly)
    {
        var attribute = assembly.GetCustomAttributes(typeof (AssemblyDescriptionAttribute), false)
            .Select(a => a as AssemblyDescriptionAttribute).FirstOrDefault();

        if (attribute == null)
        {
            return String.Empty;
        }

        return attribute.Description;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var assembly = Assembly.GetExecutingAssembly();
        Console.WriteLine(assembly.GetDescription());
        Console.ReadKey();
    }
}
Console.WriteLine(typeof(Program).Assembly.GetAssemblyDescription());
var descriptionAttribute=程序集
.GetCustomAttributes(typeof(AssemblyDescriptionAttribute),false)
第()类
.FirstOrDefault();
if(descriptionAttribute!=null)
Console.WriteLine(descriptionAttribute.Description);
[编辑更改为ICCustomAttributeProvider的程序集,参见Simon Svensson的回答)

如果您非常需要此类代码,请在ICCustomAttributeProvider上创建一个扩展方法:

 public static T GetAttribute<T>(this ICustomAttributeProvider assembly, bool inherit = false) 
 where T : Attribute 
 {
     return assembly
         .GetCustomAttributes(typeof(T), inherit)
         .OfType<T>()
         .FirstOrDefault();
}
public static T GetAttribute(此ICustomAttributeProvider程序集,bool inherit=false)
其中T:Attribute
{
返回组件
.GetCustomAttributes(typeof(T),inherit)
第()类
.FirstOrDefault();
}
正如Yuriy所解释的,由于.Net 4.5,框架中提供了一种扩展方法:

var descriptionAttribute = 
    assembly.GetCustomAttribute<AssemblyDescriptionAttribute>();
var descriptionAttribute=
assembly.GetCustomAttribute();

虽然此代码已经相对简洁,但您可以利用一点LINQ来清理它

AssemblyDescriptionAttribute attribute = assembly
    .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
    .OfType<AssemblyDescriptionAttribute>()
    .SingleOrDefault();

if(attribute != null)
{
    Console.WriteLine(attribute.Description);
}
AssemblyDescriptionAttribute属性=程序集
.GetCustomAttributes(typeof(AssemblyDescriptionAttribute),false)
第()类
.SingleOrDefault();
if(属性!=null)
{
Console.WriteLine(属性描述);
}

我将使用的扩展方法来提供一个强类型的
GetCustomAttributes
,它返回一个强类型的枚举。linq的唯一用法是调用
FirstOrDefault
of type

public static void Main() {
    Assembly assembly = Assembly.GetExecutingAssembly();
    var descriptionAttribute = assembly
        .GetCustomAttributes<AssemblyDescriptionAttribute>(inherit: false)
        .FirstOrDefault();

    if (descriptionAttribute != null) {
        Console.WriteLine(descriptionAttribute.Description);
    }

    Console.ReadKey();
}

public static IEnumerable<T> GetCustomAttributes<T>(this ICustomAttributeProvider provider, bool inherit) where T : Attribute {
    return provider.GetCustomAttributes(typeof(T), inherit).OfType<T>();
}
publicstaticvoidmain(){
Assembly=Assembly.getExecutionGassembly();
变量descriptionAttribute=程序集
.GetCustomAttributes(继承:false)
.FirstOrDefault();
if(descriptionAttribute!=null){
Console.WriteLine(descriptionAttribute.Description);
}
Console.ReadKey();
}
公共静态IEnumerable GetCustomAttributes(此ICustomAttributeProvider提供程序,bool inherit),其中T:Attribute{
返回provider.GetCustomAttributes(typeof(T),inherit).OfType();
}
var attribute=Assembly.getExecutionGassembly()
.GetCustomAttributes(typeof(AssemblyDescriptionAttribute),false)
.Cast().FirstOrDefault();
if(属性!=null)
{
Console.WriteLine(属性描述);
}

我会这样做:

 var descriptionAttribute = assembly
         .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
         .OfType<AssemblyDescriptionAttribute>()
         .FirstOrDefault();

 if (descriptionAttribute != null) 
     Console.WriteLine(descriptionAttribute.Description);
public static class AssemblyExtensions
{
    public static string GetDescription(this Assembly assembly)
    {
        var attribute = assembly.GetCustomAttributes(typeof (AssemblyDescriptionAttribute), false)
            .Select(a => a as AssemblyDescriptionAttribute).FirstOrDefault();

        if (attribute == null)
        {
            return String.Empty;
        }

        return attribute.Description;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var assembly = Assembly.GetExecutingAssembly();
        Console.WriteLine(assembly.GetDescription());
        Console.ReadKey();
    }
}
Console.WriteLine(typeof(Program).Assembly.GetAssemblyDescription());
现在,它很容易压缩成两行代码,如果太大,可以将其转储到扩展方法中:

public static string GetAssemblyDescription(this Assembly assembly)
{
    return assembly.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
        .OfType<AssemblyDescriptionAttribute>().SingleOrDefault()?.Description;
}

按照@ab kolan的回答,可能会更简单:

    var description = Assembly
            .GetExecutingAssembly()
            .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
            .OfType<AssemblyDescriptionAttribute>()
            .FirstOrDefault()?
            .Description ?? "";
var description=Assembly
.getExecutionGassembly()
.GetCustomAttributes(typeof(AssemblyDescriptionAttribute),false)
第()类
.FirstOrDefault()?
.Description??”;

如果您只对当前的执行过程感兴趣(而不是原始帖子中的组装),那么它就是一个简单的单行程序

Console.WriteLine(Process.GetCurrentProcess().MainModule.FileVersionInfo.Comments);

在这种情况下,不需要LINQ或lambda表达式

从.NET 4.5开始,您可以享受反射属性的乐趣:

var descriptionAttribute = assembly.GetCustomAttribute<AssemblyDescriptionAttribute>();

if (descriptionAttribute != null)
    Console.WriteLine(descriptionAttribute.Description);
var descriptionAttribute=assembly.GetCustomAttribute();
if(descriptionAttribute!=null)
Console.WriteLine(descriptionAttribute.Description);

如果您指的是装配信息中的说明:

[右键单击项目->应用程序->程序集信息]

我建议使用这个类, 您可以看到一个示例:

当我使用它时,通过使用反射,我手头有一个
类型
,我做到了:

using Microsoft.VisualBasic.ApplicationServices;

AssemblyInfo info = new AssemblyInfo(type.Assembly);
string description = info.Description;

我认为这段代码在
var descriptionAttribute=assembly
中已经足够好了。请注意,这段
GetAttribute
可能不适用于所有程序集属性。例如,要获取
AssemblyVersionAttribute
,可以使用
assembly.GetName().Version
改为。在我看来,你没有回答任何问题。问题不是如何在Visual Studio下检查描述,而是如何在代码中获取描述。如果在你的某个链接下可以找到答案,请将示例代码放在这里。我没有减去你的答案,所以至少有一个人在你的答案中有与我相同的感觉。主要位置是关于描述的位置。因此回答指南告诉“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接的最相关部分,以防无法访问目标站点或永久脱机。”-这就是我发表评论的原因。