2

プラグインをロードするアプリケーションがあります。フォーム インスタンスに完全にアクセスできるプラグインがあります。オーバーライドする必要があるフォームに関数があるが、仮想関数ではない場合、それをオーバーライドする別の方法はありますか?

非常に一般的な例を次に示します。

//Form I am modifying
public partial class MyForm : Form
{
    public int myVariable1;
    public int myVariable2;

    //Constructor and other methods here

    private void setVar(int replacementValue)
    {
        myVariable1 = replacementValue;
    }
}

...次に、別のdllで...

//My plugin
public class MyPlugin : IMyPluginBase
{
    MyForm theForm; //Reference to the form in the main application

    //Constructor and other methods here

    private void setVar(int replacementValue)
    {
        theForm.myVariable2 = replacementValue;
    }
}

この例では、フォームの関数は「myVariable1」を設定しますが、プラグインの「setVar」関数は「myVariable2」を設定します。

問題は、この例の場合、フォームの「setVar」関数をプラグインの関数で置き換え/オーバーライドできるかということです。多分メッセージや反射で?

4

3 に答える 3

2

いいえ。C#のプライベート非仮想メソッドを「置き換える」またはオーバーライドすることはできません。

C#言語(および.NETランタイム)は、説明した方法でのメソッドの動的置換をサポートしていません。私の知る限り、この機能をサポートしている言語はほとんどありません(SmallTalkとObjective-Cの両方がサポートしていると思います)。

これがこの種の拡張性を必要とするアプリケーション内の唯一の場所である場合は、インターフェース、デリゲート、または継承+仮想メソッドを介してそれを実現できます。これらのアプローチはどれでも機能する可能性があります...どちらを選択するかは、必要な拡張性の種類によって異なります。

アプリにこのような拡張ポイントが多数あると予想される場合は、Managed Extensibility Framework(MEF)を確認する必要があります。これは、.NETで適切に機能するパターンと手法を使用してプラグインアーキテクチャを作成するためのMicrosoftサポートモデルを提供します。

于 2010-12-06T21:57:29.677 に答える
1

関数が仮想またはクラスが実装するインターフェイスの一部としてマークされていない場合、それをオーバーライドできる可能性はまったくありません。プラグインなし、リフレクションなし、何もありません。単にそれを忘れるか、C# ではなく他の動的言語を使用してください。

于 2010-12-06T21:59:08.787 に答える
0

あなたの質問に対する簡単な答えはノーです。ただし、フォームにIMyPluginBaseのコピーを渡し、Form.setVar()でMyPluginBase.SetVar()を呼び出すことができます。

コードは次のようになります。

public partial class MyForm : Form
{
    public int myVariable1;
    public int myVariable2;

    public IMyPluginBase MyPlugin;

    //Constructor and other methods here

    private void setVar(int replacementValue)
    {
        MyPlugin.setVar(replacementValue);
        //myVariable1 = replacementValue;
    }
}

public class MyPlugin : IMyPluginBase
{
    MyForm theForm; //Reference to the form in the main application
    public void setVar(int replacementValue)
    {
        theForm.myVariable2 = replacementValue;
    }
}

setVar()はIMyPluginBaseで定義する必要があることに注意してください。

于 2010-12-06T21:57:13.720 に答える