0

その場で仮想基本クラス関数をオーバーライドし、このオーバーライドされたメソッドをアプリケーションで使用したいと思います。基本的なサンプルクラスを書くと:

partial Class myBase
{
   public myBase() {}
   public virtual void DoStuff()
   {
      throw new Exception("this function is not overriden");
   }
}

partial Class myDeriv : myBase
{
   public myDeriv() {}
}

そして今、その場で myDeriv.DoStuff をオーバーライドしたいと思います。そこで、文字列コード ブロックを作成し、次を使用してコンパイルします。

CSharpCodeProvider.CompileAssemblyFromSource

方法。このdllをディスクに書き込んだ後、次を使用してロードしようとしました

Assembly.LoadFrom("onTheFly.dll");

しかし、アプリケーションはこのオーバーライドされた関数を見つけることができません。他のより良い解決策があれば、私もそれらを受け入れます..関数をその場でオーバーライドするだけです..

皆さん、ありがとうございました!

4

1 に答える 1

1

ここまたはここに記載されているのと同じルールが原因のようでありえないと思います

原文から引用:

「2 つの異なるアセンブリ (プロジェクト) で同じクラスを参照する 2 つの部分クラスを持つことはできません。アセンブリがコンパイルされると、メタデータが組み込まれ、クラスは部分的ではなくなります。部分クラスを使用すると、定義を分割できます。同じクラスのファイルを 2 つのファイルに分けます。」

また

「partial キーワードを使用して、クラスのコードをプロジェクト間で分割することはできません。partial キーワードはコンパイラのトリックです。コンパイラは、見つかった部分から 1 つのクラスを出力するため、クラスのすべての部分が同じで存在する必要があります。バイナリ ファイル. クラスがコンパイルされると、部分クラスである痕跡は残りません。

既存のクラスを拡張したい場合は、それを継承する (封印されていない場合) か、情報を結合したいクラスを含む独自の新しいクラスを作成する必要があります。」

于 2011-12-30T14:54:18.600 に答える