Pregunta ¿Manera simplificada de obtener la descripción del conjunto en C #?


Estaba leyendo un libro de .NET 2.0 y encontré este código de ejemplo que obtiene la descripción del conjunto de aplicaciones:

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 bastante código simplemente obtener la descripción del conjunto y me gustaría saber si hay una manera más simple de hacer esto en .NET 3.5+ usando expresiones LINQ o lambda.


13
2018-04-18 05:52


origen


Respuestas:


No hay, realmente. Puedes hacerlo un poco 'más fluido' de esta manera:

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

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

[EDIT cambió Assembly a ICustomAttributeProvider, cf. respuesta de Simon Svensson)

Y si necesita este tipo de código mucho, haga un método de extensión en ICustomAttributeProvider:

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

28
2018-04-18 06:00



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

5
2018-04-18 06:02



Usaría un método de extensión para ICustomAttributeProvider para proporcionar un fuerte tipado GetCustomAttributes que devuelve un enumerable fuertemente tipado. El único uso de linq sería la llamada a FirstOrDefault y 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
2018-04-18 06:01



Si bien este código ya es relativamente conciso, podría aprovecha un poco de LINQ para limpiarlo un poco.

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

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

1
2018-04-18 06:01



Haría algo como esto:

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

1
2018-04-18 06:03



Siguiendo la respuesta de @ab-kolan, podría ser aún más simple:

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

1
2018-03-10 15:18



Aquí tienes, se condensa fácilmente en dos líneas de código, y si es demasiado grande, puedes volcarlo en un método de extensión:

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

Entonces solo usa el método de extensión así:

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

0
2018-02-01 02:43



Si solo está interesado en el proceso de ejecución actual (en comparación con el montaje según la publicación original), entonces es un trazador de líneas simple.

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

0
2018-02-19 06:46