2016-07-20 58 views
8

我知道.NET核心更換爲Assembly.GetExecutingAssembly()typeof(MyType).GetTypeInfo().Assembly,但對於更換如何獲取AssemblyTitle?

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

我曾嘗試追加碼的最後一位組裝後,像這樣提到的第一個解決方案:

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

,但它給了我一個「無法隱式轉換爲對象[]消息

更新: 是的,正如下面的評論所示,我相信它與輸出類型有關。

這裏是代碼片段,而我只是想改變它是與.net核心兼容:

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

我試圖改變這種使用CustomAttributeExtensions.GetCustomAttributes(,但我不明白現在的C#足夠知道如何實現與上面相同的代碼。我仍然混淆了MemberInfo和Type等。任何幫助非常感謝!

+0

你從哪裏獲得錯誤信息? 'VersionInfo'與你試圖閱讀的'AssemblyTitle'在同一個程序集中? –

回答

9

我懷疑問題在你沒有顯示的代碼中:其中y ou使用GetCustomAttributes()的結果。那是因爲Assembly.GetCustomAttributes(Type, bool) in .Net Framework returns object[],而CustomAttributeExtensions.GetCustomAttributes(this Assembly, Type) in .Net Core returns IEnumerable<Attribute>

所以你需要相應地修改你的代碼。最簡單的方法是使用.ToArray<object>(),但更好的解決方案可能是更改代碼,以便它可以與IEnumerable<Attribute>一起使用。

+0

你已經明確瞭解情況。我已經添加了更多我正在使用的代碼,希望獲得一些額外的指導。 – PirateJubber

+0

@PirateJubber已添加。 – svick

5

這對我的作品在.NET 1.0的核心:

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

我忽略了分享我正在嘗試做的事情的全部情況,但是你是對的,你的解決方案確實解決了錯誤。有什麼方法可以重新使用它來處理object []? – PirateJubber

3

這個工作對我來說:

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

    return attributes?.Title; 
} 
0

這是我使用:

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