25
using System;

class Runner
{
    static void Main()
    {
        A a = new A();
        // how to say a.PrintStuff() without a 'using'
        Console.Read();
    }
}

class A { }

namespace ExtensionMethod
{
    static class AExtensions
    {
        public static void PrintStuff(this A a)
        {
            Console.WriteLine("text");
        }
    }
}

「using」なしで拡張メソッドを呼び出すにはどうすればよいですか? ExtensionMethod.AExtensions.PrintStuff(a) ではありません。これは拡張メソッドを使用しないためです。

4

7 に答える 7

28

this拡張機能は単純な静的メソッドであるため、最初のパラメーターとして機能するインスタンスを渡すことで、拡張機能を直接呼び出すことができます。

A a = new A();
ExtensionMethod.AExtensions.PrintStuff(a);

より一般的に使用される拡張メソッドでこのパターンに従った場合、このコードに遭遇した他の開発者は混乱する可能性があります。また、LINQ などの連鎖拡張呼び出しは、連鎖ではなく各呼び出しを入れ子にするため、より関数型言語のように見えます。

于 2014-12-17T23:36:11.833 に答える
5

using関数がどこにあるかを知る必要があります。Linq でのこの一例。IEnumerable<T>'System.Linq を使用しないと、どのsでも linq が有効になりません。

ただし、呼び出し元と同じ名前空間で拡張メソッドを定義して、using を配置しないようにすることができます。ただし、多くの名前空間で必要な場合、このアプローチは機能しません

于 2013-07-24T03:16:55.403 に答える
4

これは汚い気がしますが、拡張メソッドを System 名前空間に置くことができます。この名前空間はデフォルトで質問に含まれています

using System;

class Runner
{
    static void Main()
    {
        A a = new A();
        // how to say a.PrintStuff() without a 'using'
        Console.Read();
    }
}

class A { }

namespace System
{
    static class AExtensions
    {
        public static void PrintStuff(this A a)
        {
            Console.WriteLine("text");
        }
    }
}
于 2013-07-24T03:44:07.870 に答える
2

タイプExtendableTypeの拡張メソッドの作成に関する反論:

  • クラスに名前を付けます ExtendableTypeExtensions
  • クライアントが同じパターンに従って拡張メソッドを追加できるように、拡張クラスのパーシャルを宣言します。
  • 拡張メソッドを基本型と同じ名前空間に配置します

LINQのようなモデルに従う十分な理由がない限り:

  • 拡張メソッドの実質的なファミリー、
  • それはすべて、複数の基本クラスに適用されます。
于 2013-07-24T04:18:14.120 に答える
1

名前空間なしで拡張メソッドを追加できます。これは推奨されないシステム全体に影響します。

public static class StringExtensions
{       
    public static void HelloWorld(this String s)
    {
        Console.Write("Hello World");
    }
}



    string str = "s";
    str.HelloWorld();
于 2019-12-06T06:45:42.913 に答える