2009-08-01 9 views
6

派生クラスで表示されるように、基本クラスへの拡張メソッドを追加:C#の:彼らは私は現在、このようSystem.Windows.Forms.Control上の拡張メソッドを持っている

public static void ExampleMethod(this Control ctrl){ /* ... */ } 

しかし、この方法ではありませんPictureBoxなど、Controlから派生したクラスに表示されます。 Controlだけでなく、Controlから派生したクラスのために、明示的にキャストしなくても表示される拡張メソッドを作成できますか?

+0

[拡張型の基本クラスから拡張メソッドを呼び出すことができないのはなぜですか?](http://stackoverflow.com/questions/27883427/why-cant-i-call-an-エクステンションメソッドfrom-the-extended-class-of-the-extended-type) –

答えて

13

拡張クラスが定義されている名前空間にusingステートメントを含めるか、拡張メソッドがスコープに含まれないようにする必要があります。

拡張メソッドは、派生タイプ(System.LinqのIEnumerable<T>で定義されている拡張メソッドなど)でうまく機能します。

public static void ExampleMethod<T>(this T ctrl) 
    where T : Control 
{ /* ... */ } 

いいえ、あなたは、...それはまた、あなたが掲示非ジェネリックバージョンで動作するはずですしなければならないため、名前空間を追加するために覚えていない:

+0

ありがとう!別の名前空間で定義され、usingステートメントが追加されました。 – MiffTheFox

+0

名前空間とスコープここで私を助けたキーワード。ありがとうございました! – GregoryBrad

8

実際に拡張メソッドは、拡張される型のすべての継承者/実装者(この場合はControl)に適用されます。 usingステートメントをチェックして、拡張メソッドが呼び出されている場所で拡張メソッドが参照されていることを確認してください。

-2

は、私はあなたが一般的な拡張をしなければならないと思いますあなたの内線番号。

1

また、拡張が名前空間に定義されていないことを確認して、それらを参照するプロジェクトが自動的にインポートされるようにすることもできます。

0

注意あなたがそれに適用される拡張メソッドを持つ基本クラスから継承したクラス内のプロパティから拡張メソッドを呼び出す場合、あなたはthis

例えばと拡張メソッドを接尾辞にも持っていることを

public int Value 
{ 
    get => this.GetValue<int>(ValueProperty); 
    set => SetValue(ValueProperty, value); 
} 

ここで、GetValueは、ベースクラスに適用される自分の拡張メソッドです。

関連する問題