web-dev-qa-db-ja.com

認識されない拡張メソッド

インポートされたアセンブリに拡張メソッドが存在する場合、それを尊重するために何が必要ですか?クラスライブラリプロジェクトでビルドしましたが、ライブラリを参照するWebプロジェクトでは認識されません。ライブラリの他のすべてのクラスとメソッドは尊重され、表示されますが、この拡張メソッドはそうではありません。拡張メソッドは、ライブラリ内で使用すると表示されます。

46
ChiliYago

拡張メソッドを含むクラスを含むアセンブリを参照するだけでは不十分です。拡張メソッドを使用する各ソースファイルに、クラスを含む名前空間をインポートする必要があります。

たとえば、LINQ-to-objectsを使用するには、System.Core Assemblyを参照してSystem.Linq名前空間(LINQを含むEnumerableクラスを含む)をインポートする必要があります。拡張メソッド):

using System.Linq;
59
dtb

拡張メソッドが公開されてもよろしいですか?

17
Arjan Einbu

Extension構文を使用していないときにExtensionメソッドを呼び出すことができる場合は、次の形式を使用します。

this.MyExtensionMethod()

これにより、VS2010でクラスのExtensionメソッドが見つからないという問題が解決しました。

15

VB.NETで同じ問題が発生しているときにここに到達した場合は、拡張メソッドだけでなくモジュール自体をPublicとしてマークする必要があることに注意してください。このエラーが発生します。これは、少なくともVS2015コミュニティの場合に当てはまり、他のバージョンでも当てはまる可能性があります。

2
dotNET

疑問に思う方のために、私はこれと同じ問題を抱えており、どの回答もうまくいきませんでした。アセンブリのusingステートメントがエイリアスされていたことが原因でした:

using ex = MyApp.Example

エイリアスの削除は機能しましたが、代わりに、エイリアスのない重複したusingを追加することにしました。これも問題を修正しました。

using MyApp.Example
using ex = MyApp.Example
0
CAVX

以下に示すように、相互に参照されているソリューションの列挙型の拡張メソッドを使用してこの問題が発生しました。 IntellisenseはApplicationUIプロジェクトの拡張メソッドで機能し、コンパイルエラーや実行時エラーなしで実行されました。しかし、この方法は単に機能しませんでした。また、イミディエイトウィンドウでは、BusinessObjectLib.MyEnumに拡張メソッドの名前のメソッドが含まれておらず、拡張メソッドが見つからないことを確認しました。

GenericLib - project where extension method on generic enums is defined
BusinessObjectLib - project where enums were defined, references GenericLib
ApplicationUI - project referencing both GenericLib and BusinessObjectLib

ソリューションエクスプローラーはApplicationUIからすべてのプロジェクトを表示しても問題ないように見えましたが、BusinessObjectLibプロジェクトを開いたときに、何らかの理由でGenericLibへの参照が壊れているのを確認できました。 (すべてのコードと同様に、VSにもおそらくバグがありますか?)。まず、VSで直接開いたBusinessObjectLibプロジェクトで作業し、参照を削除してから、プロジェクトを削除して、両方を逆の順序で復元しました。次に、ApplicationUI.souファイルの名前を変更して、強制的に再構築しました。これらのアクションでこの問題を修正することができましたが、.souファイルの名前変更のみが問題を解決するようです。即時ウィンドウstillでも引き続き同じエラーが発生しますが、少なくともランタイムコードは再び機能します。私はこの正確なパターンを他のいくつかのプロジェクトで使用していますが、ここで問題が発生することはありません。

0
B H

テンプレートを使用する場合は、テンプレート宣言がメソッドシグネチャで宣言されているものと「this」で一致していることを確認してください。

そう、

SomeClass<string, string> test = new SomeClass<string, string>();

extensionMethod<key, val>(this SomeClass<key, Lazy<val>>, string val)
{
}

遅延ラッパーのため、拡張メソッドは表示されません。

0
eaglei22

私に役立つ実装例について:

(すでに言及されているthisキーワードに注意してください)。

    /// <summary>
    /// Convert current bytes to string
    /// </summary>
    /// <param name="bytes">Current byte[]</param>
    /// <returns>String version of current bytes</returns>
    public static string StringValue(this byte[] currentBytes)
    {
        return string.Concat(Array.ConvertAll(bytes, b => b.ToString("X2")));
    }
0
user919426

動的型に注意してください。

多くの答えがあり、それらのどれも私の問題を解決しませんでした、誰かがこれに直面した場合、私の場合、サードパーティのライブラリが「dynamic」型を返し、私の拡張メソッドが文字列に対して機能していたため、適用するとき拡張メソッドではコンパイルエラーは表示されませんでしたが、実行時に表示されました。

var a = thirdpartyLibrary.GetValue().MyExtensionMethod();

同じタイプの拡張メソッドへのキャストで問題が解決しました。

0
Rolando Retana

私の場合、Extensionメソッドは、コンポーネントの異なるバージョンを参照している外部参照にありました。私は両方のプロジェクトでバージョンを同期しましたが、うまくいきました。

0
Marco Alves

メソッドの署名に注意する必要があります

public static ILoggingBuilder AddCustomizedLogging(このILoggingBuilderビルダー、文字列appInsightsKey)

「this」修飾子は拡張メソッドに必要です

0
VISHAL KUMAWAT