15

私は.NET2.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();
}

アセンブリの説明を取得するだけのコードは非常に多く、LINQまたはラムダ式を使用して.NET 3.5以降でこれを行う簡単な方法があるかどうかを知りたいですか?

4

10 に答える 10

32

ありません、本当に。次のように、もう少し「流暢」にすることができます。

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

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

[EDIT は Assembly を 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();
}

.Net 4.5 以降、Yuriy が説明したように、フレームワークで拡張メソッドを使用できます。

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 に答える
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 に答える