2012-04-18 10 views
12

私は、.NET 2.0本を読み、アプリケーションのアセンブリの説明を取得します。このサンプルコードに出くわした:C#でアセンブリ記述を取得する簡略化された方法は?

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以降でこれを行う簡単な方法がありますか?

+7

...シンプルな1つのライナーだ私は、このコードは '()'のための –

答えて

27

本当にありません。あなたは、このような、それは少し「より流暢」することができます:

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

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

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

は、あなた少しを活用することができLINQを触ってそれをきれいにする。

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

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

は、私は強く、強く型付けされた列挙を返しGetCustomAttributesを入力提供するICustomAttributeProviderための拡張メソッドを使用します。それは、2行のコードに簡単に凝縮 -

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(); 
    } 
} 
4
var attribute = Assembly.GetExecutingAssembly() 
        .GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false) 
        .Cast<AssemblyDescriptionAttribute>().FirstOrDefault(); 
if (attribute != null) 
{ 
    Console.WriteLine(attribute.Description); 
} 
+1

+1十分だと思います。 – abatishchev

1

への呼び出しになります - それが大きすぎる場合は、拡張メソッドにダンプできます:

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

あなたはこのように拡張メソッドを使用します。

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

ここに行く - :唯一の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>(); 
} 
1

AB-kolan答え@の後に、それはよりシンプルにできます。

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

あなたが現在実行中のプロセスでのみ興味があるなら(対オリジナルのポストごとのように組み立て)、それは

Console.WriteLine(Process.GetCurrentProcess().MainModule.FileVersionInfo.Comments); 
関連する問題