15

我正在阅读一本 .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 表达式是否有更简单的方法?

4

10 回答 10

32

没有,真的。你可以像这样让它“更流利”一点:

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

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

[编辑将程序集更改为 ICustomAttributeProvider,参见。西蒙斯文森的回答)

如果你需要这种代码很多,在 ICustomAttributeProvider 上做一个扩展方法:

 public static T GetAttribute<T>(this ICustomAttributeProvider assembly, bool inherit = false) 
 where T : Attribute 
 {
     return assembly
         .GetCustomAttributes(typeof(T), inherit)
         .OfType<T>()
         .FirstOrDefault();
}

正如 Yuriy 解释的那样,从 .Net 4.5 开始,框架中提供了一种扩展方法:

var descriptionAttribute = 
    assembly.GetCustomAttribute<AssemblyDescriptionAttribute>();
于 2012-04-18T06:00:44.063 回答
7
var attribute = Assembly.GetExecutingAssembly()
                    .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
                    .Cast<AssemblyDescriptionAttribute>().FirstOrDefault();
if (attribute != null)
{
    Console.WriteLine(attribute.Description);
}
于 2012-04-18T06:02:12.067 回答
4

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

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>();
}
于 2012-04-18T06:01:33.953 回答
4

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

    var description = Assembly
            .GetExecutingAssembly()
            .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
            .OfType<AssemblyDescriptionAttribute>()
            .FirstOrDefault()?
            .Description ?? "";
于 2017-03-10T15:18:26.633 回答
4

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

从 .NET 4.5 开始,您可以享受扩展方法来反映属性:

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

if (descriptionAttribute != null)
    Console.WriteLine(descriptionAttribute.Description);
于 2019-03-31T18:38:50.477 回答
3

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

Console.WriteLine(Process.GetCurrentProcess().MainModule.FileVersionInfo.Comments);
于 2018-02-19T06:46:15.107 回答
1

虽然这段代码已经相对简洁,但您可以利用一点 LINQ 对其进行清理。

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

if(attribute != null)
{
    Console.WriteLine(attribute.Description);
}
于 2012-04-18T06:01:28.787 回答
1

我会做这样的事情:

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();
    }
}
于 2012-04-18T06:03:27.473 回答
0

给你——它很容易压缩成两行代码——如果它太大了,你可以把它转储到一个扩展方法中:

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

然后你只需像这样使用扩展方法:

Console.WriteLine(typeof(Program).Assembly.GetAssemblyDescription());
于 2017-02-01T02:43:48.477 回答
-2

如果您指的是组装信息中的描述: 项目的装配信息窗口

[右键单击一个项目->应用程序->组装信息]

我建议使用AssemblyInfo类,您可以在此处查看示例:

当我使用它时,我Type type通过使用反射来掌握它,我做到了:

using Microsoft.VisualBasic.ApplicationServices;

AssemblyInfo info = new AssemblyInfo(type.Assembly);
string description = info.Description;
于 2020-06-23T09:45:24.780 回答