4

我有一個需要更新的舊產品,用C#和.Net 2.0編寫。該項目已更新與Visual Studio 2010(其中包括C#4.0編譯器)一起使用,但我無法將框架從2.0升級到任何更高版本。在.Net 2.0項目中創建擴展方法,使用C#4.0編譯

我發現了多篇文章(如this question),這些文章是在C#3.0編譯器附帶的VS 2008的附近編寫的,指出您可以通過定義自己的擴展方法屬性類來創建自己的擴展方法用2.0框架編寫的項目。但是,我似乎無法找到任何參考,說明在.NET 2.0項目中是否仍然需要使用C#4.0。

在我的項目中,我是否還需要定義自定義擴展屬性類,或者是否已經對C#4.0編譯器進行了改進,以便它可以簡化過程?

回答

3

我似乎無法找到任何參考,指出在.NET 2.0項目中是否仍然需要使用C#4.0。

是的。編譯器需要該屬性。無論你自己定義它還是使用System.Core中的那個都取決於你。雖然在你的特定情況下,System.Core不是一個選項,因爲這只是.NET 3.5的一部分。

一旦您升級到更高版本,3.5或更高版本,您可以安全地從您的項目中一併刪除此屬性,只需使用System.Core中的那個。

如果您已升級到Visual Studio 2010;那麼您正在使用C#4.0編譯器。這意味着,所有你需要的是一個ExtensionAttribute

namespace System.Runtime.CompilerServices 
{ 
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] 
    public class ExtensionAttribute : Attribute 
    { 
    } 
} 

必須以正確的命名空間。

一旦你得到了什麼地方,你可以聲明的擴展方法以正常的方式(因爲你使用的是C#4.0編譯器):

public static class Extensions 
{ 
    public static string ToTitleCase(this string str) 
    { 
     //omitted 
    } 
} 

,然後使用它像一個擴展方法:

var str = "hello world"; 
str.ToTitleCase(); 

你自己實際上並不需要把ExtensionAttribute放在任何東西上; C#4.0編譯器會爲你做。實質上,所有編譯器的需求是能夠找到一個名爲ExtensionAttribute的屬性。

+1

Brr,討厭的黑客。雖然工作。如果忘記刪除我想象的屬性,稍後升級會有點痛苦。 –

+0

@HansPassant我不認爲這會是災難性的。編譯器只會選擇哪個屬性是「最接近」的。如果當前裝配中有一個,它將使用該裝配。我不認爲編譯器在意*哪個*屬性被使用;只要它有正確的(全名)名稱即可。雖然同意,但它有點難看。 – vcsjones

+0

是的,這是我希望能夠避免的。我需要更新的應用程序非常強大,雖然它很舊,但我仍然需要每六個月更新一次,並且由於公司要求而無法更新框架(錯誤...)這似乎不是可怕的黑客,但黑客是我傾向於在生產代碼中不惜一切代價避免的東西。 – RLH