2012-04-18 11 views
12

Ich las über ein 2.0 Buch .NET und über diesem Beispielcode kam, die die Anwendungen Montagebeschreibung bekommt:Vereinfachte Methode zum Abrufen der Assembly-Beschreibung in 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(); 
} 

Es ist ziemlich viel Code, um einfach die Montagebeschreibung zu bekommen, und ich würde, wenn wissen, gibt es einen einfacheren Weg, dies in .NET 3.5+ mit LINQ oder Lambda-Ausdrücke zu tun?

+7

ich denke, dieser Code gut genug –

Antwort

27

Gibt es nicht, wirklich. Sie können es ein bisschen ‚fließender‘ wie folgt machen:

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

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

[EDIT Versammlung ICustomAttributeProvider geändert, vgl Antwort von Simon Svensson)

Und wenn Sie diese Art von Code eine Menge benötigen, eine Erweiterungsmethode auf ICustomAttributeProvider machen:

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

Während dieser Code bereits relativ präzise ist, Sie konnte Hebelwirkung ein wenig von LINQ, um es zu bereinigen.

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

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

würde ich eine Erweiterungsmethode für ICustomAttributeProvider verwendet eine stark GetCustomAttributes getippt zu schaffen, die wieder ein stark enumerable getippt. Die einzige Linq Nutzung wäre der Aufruf von FirstOrDefault und OfType

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

+1 für '()' ist. – abatishchev

1

ich so etwas tun würde:

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

Hier gehen Sie - es kondensiert leicht zu zwei Zeilen Code - - und wenn das zu groß ist, können Sie es in eine Erweiterungsmethode ablegen:

Dann Sie nur die Erweiterung Methode wie folgt verwenden:

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

Nach @ ab-kolan Antwort, könnte es noch einfacher sein:

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

Wenn Sie in der aktuellen Ausführung Prozess nur daran interessiert sind (im Vergleich zu Montag nach der ursprünglichen Post), dann ist es ein einfaches Motto ..

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