在C#中获得汇编描述的简化方法?

问题描述 投票:13回答:9

我正在阅读.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表达式执行此操作?

c# linq reflection .net-4.0 lambda
9个回答
28
投票

真的没有。你可以这样做一点'更流利':

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

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

[编辑将大会改为ICustomAttributeProvider,参见Simon Svensson回答)

如果您需要这么多代码,请在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>();

5
投票
var attribute = Assembly.GetExecutingAssembly()
                    .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
                    .Cast<AssemblyDescriptionAttribute>().FirstOrDefault();
if (attribute != null)
{
    Console.WriteLine(attribute.Description);
}

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>();
}

3
投票

关注@ ab-kolan回答,它可能更简单:

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

1
投票

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

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

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

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();
    }
}

0
投票

在这里 - 它很容易压缩到两行代码 - 如果它太大,你可以将它转储到扩展方法:

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

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

Console.WriteLine(typeof(Program).Assembly.GetAssemblyDescription());

0
投票

如果你只对当前的执行过程感兴趣(相对于原始帖子的装配),那么这是一个简单的一个班轮..

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

0
投票

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

从.NET 4.5开始,您可以享受extension method来反映属性:

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

if (descriptionAttribute != null)
    Console.WriteLine(descriptionAttribute.Description);
© www.soinside.com 2019 - 2024. All rights reserved.