2016-07-20 13 views
8

wiem wymiana NET Rdzeń dla Assembly.GetExecutingAssembly() jest typeof(MyType).GetTypeInfo().Assembly, ale co o zamiennikJak zdobyć AssemblyTitle?

Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false) 

próbowałem dołączenie ostatni kawałek kodu po montażu za pierwszym rozwiązaniem wspomnianego tak:

typeof(VersionInfo).GetTypeInfo().Assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute)); 

ale daje mi „nie można niejawnie przekonwertować do object [] komunikat

UPDATE:. Tak, jak zaznaczają poniższe komentarze, uważam, że jest on powiązany z typem pliku wyjściowego.

Oto fragment kodu, a ja po prostu staramy się zmienić ją za zgodną z .NET Rdzeń:

public class VersionInfo 
{ 
    public static string AssemlyTitle 
    { 
    get 
    { 
     object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); 
     // More code follows 

Próbowałem zmianę tego użyć CustomAttributeExtensions.GetCustomAttributes( ale obecnie nie tyle zrozumieć C# wiedzieć, jak zaimplementować ten sam kod, co powyżej. Nadal jestem pomieszany o MemberInfo i Type i tym podobne. Każda pomoc jest niezwykle cenna!

+0

Skąd się komunikat o błędzie? Czy 'VersionInfo' jest w tym samym zestawie co' AssemblyTitle', który próbujesz przeczytać? –

Odpowiedz

9

Podejrzewam, że kwestia jest w kodzie, którego nie pokazałeś: gdzie y użyj wyniku z GetCustomAttributes(). To dlatego, że Assembly.GetCustomAttributes(Type, bool) in .Net Framework returns object[], podczas gdy CustomAttributeExtensions.GetCustomAttributes(this Assembly, Type) in .Net Core returns IEnumerable<Attribute>.

Musisz odpowiednio zmodyfikować swój kod. Najprostszym sposobem byłoby użycie .ToArray<object>(), ale lepszym rozwiązaniem może być zmiana kodu tak, aby działał z IEnumerable<Attribute>.

+0

Zdecydowanie rzuciłeś trochę światła na tę sytuację. Dodałem więcej kodu, nad którym pracuję, w nadziei uzyskania dodatkowych wskazówek. – PirateJubber

+0

@PirateJubber Dodano. – svick

5

To działa na mnie w .NET 1.0 Rdzeń:

using System; 
using System.Linq; 
using System.Reflection; 

namespace SO_38487353 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var attributes = typeof(Program).GetTypeInfo().Assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute)); 
      var assemblyTitleAttribute = attributes.SingleOrDefault() as AssemblyTitleAttribute; 

      Console.WriteLine(assemblyTitleAttribute?.Title); 
      Console.ReadKey(); 
     } 
    } 
} 

AssemblyInfo.cs

using System.Reflection; 

[assembly: AssemblyTitle("My Assembly Title")] 

project.json

{ 
    "buildOptions": { 
    "emitEntryPoint": true 
    }, 
    "dependencies": { 
    "Microsoft.NETCore.App": { 
     "type": "platform", 
     "version": "1.0.0" 
    }, 
    "System.Runtime": "4.1.0" 
    }, 
    "frameworks": { 
    "netcoreapp1.0": { } 
    } 
} 
+0

Zaniedbałem się podzielić całą sytuacją tego, co próbowałem zrobić, ale masz rację, twoje rozwiązanie naprawia błąd. Czy istnieje sposób na przerobienie go do pracy z obiektem []? – PirateJubber

3

Działa to dla mnie:

public static string GetAppTitle() 
{ 
    AssemblyTitleAttribute attributes = (AssemblyTitleAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyTitleAttribute), false); 

    return attributes?.Title; 
} 
0

To co mam użyć:

private string GetApplicationTitle => ((AssemblyTitleAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyTitleAttribute), false))?.Title ?? "Unknown Title";