3

Objective-C でのメソッド スウィズリングのように、C# でメソッドの実装を交換することは可能ですか?

そのため、実行時に既存の実装を (外部ソースから、たとえば dll を介して) 自分のものに置き換える (または別の実装を追加する) ことができます。

私はこれを検索しましたが、価値のあるものは何も見つかりませんでした。

4

4 に答える 4

4

delegates実行時に実行したい任意のメソッドをコードで指すようにするために使用できます。

public delegate void SampleDelegate(string input);

上記は、 a を生成voidstringて入力として受け取る任意のメソッドへの関数ポインタです。その署名を持つ任意のメソッドをそれに割り当てることができます。これは、実行時に行うこともできます。

簡単なチュートリアルもMSDNにあります。

あなたのコメントに従って、編集:

public delegate void SampleDelegate(string input);
...
//Method 1
public void InputStringToDB(string input) 
{
    //Input the string to DB
}
...

//Method 2
public void UploadStringToWeb(string input)
{
    //Upload the string to the web.
}

...
//Delegate caller
public void DoSomething(string param1, string param2, SampleDelegate uploadFunction)
{
    ...
    uploadFunction("some string");
}
...

//Method selection:  (assumes that this is in the same class as Method1 and Method2.
if(inputToDb)
    DoSomething("param1", "param2", this.InputStringToDB);
else
    DoSomething("param1", "param2", this.UploadStringToWeb);

ラムダ式を使用することもできます:DoSomething("param1", "param2", (str) => {// what ever you need to do here });

別の方法として、Strategy Design Pattern. この場合、インターフェイスを宣言し、それらを使用して提供される動作を示します。

public interface IPrintable
{
    public void Print();
}

public class PrintToConsole : IPrintable
{
    public void Print()
    {
        //Print to console
    }
}

public class PrintToPrinter : IPrintable
{
    public void Print()
    {
        //Print to printer
    }
}


public void DoSomething(IPrintable printer)
{
     ...
     printer.Print();
}

...

if(printToConsole)
    DoSomething(new PrintToConsole());
else
    DoSomething(new PrintToPrinter());

2 番目のアプローチは、最初のアプローチよりも少し厳格ですが、目的を達成するための別の方法でもあると思います。

于 2015-12-29T08:12:32.200 に答える
0

「メソッドを置き換える」唯一の方法は、デリゲートを使用することです。

コードが次のようになっている場合:

public void Foo()
{
    Bar();
}

public void Bar()
{
}

Fooその後、 以外のメソッドを呼び出すことはできませんBar。Objective-C で参照するメソッド ディスパッチ テーブルは、.NET では変更できません。

Foo上記で呼び出す必要があるメソッドを指定できるようにするには、次を使用する必要がありdelegateます。

public void Foo(Action whichMethod)
{
    whichMethod();
}

そして、次のように呼び出すことができます。

Foo(Bar);
Foo(Baz);

ただし、この種のランタイム置換を可能にするためにメソッドを構築する必要があります。

于 2015-12-29T08:17:53.383 に答える
-1
void Test(Action method) {
     if ( method != null ) method.invoke();
}

あなたはこれを呼び出すことができます

Test( () => { Console.WriteLine("hello world"); } )

defを変更して再度呼び出す

Test( () => { MessageBox.Show("Hi"); } )
于 2015-12-29T08:18:20.847 に答える