4

C#と.Net 2.0で書かれた古い製品があります。プロジェクトはVisual Studio 2010(C#4.0コンパイラを含む)で動作するように更新されましたが、フレームワークを2.0から任意の上位バージョンにアップグレードすることはできません。C#4.0でコンパイルする.Net 2.0プロジェクトで拡張メソッドを作成する

C#3.0コンパイラに同梱されているVS 2008の時代に書かれた複数の記事(this questionなど)が見つかりました。独自の拡張メソッド属性クラスを定義して独自の拡張メソッドを作成できます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コンパイラを使用しています。

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

それはこの正確な名前空間でなければなりません:それはあなたが必要とするすべてはExtensionAttributeであることを意味します。

あなたがどこかに持っていると(あなたが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私はそれが壊滅的になるとは思わない。コンパイラは、これまでに属性が「最も近い」ものだけを選択します。現在のアセンブリに1つがある場合は、そのアセンブリを代わりに使用します。私はコンパイラが*どの*属性が使われているとは思わないと思います。それが正しい(完全な)名前を持っている限り。しかし、合意した、それは少し醜いです。 – vcsjones

+0

はい、これは私が避けたいと思っていたものでした。私が更新する必要があるアプリケーションは非常に堅牢で、古いですが6ヶ月ごとに更新する必要があり、企業の要件(誤って...)のためにフレームワークを更新できませんひどいハックだけどハックは、私が生産コードのすべてのコストを避ける傾向にあるものです。 – RLH

関連する問題