を使用して実行時に型を構築していますReflection.Emit
。エンド ユーザーは、基本型と、新しい型がサポートするインターフェイスを提供します。基本型がサポートできないメンバーがインターフェイスに含まれている場合は、静的フィールドに格納されているデリゲートを呼び出すスタブ メソッドを作成します (15 個以下のパラメーターを持つ非ジェネリック メソッドのみをサポートし、ref パラメーターまたは out パラメーターを使用しないのが現在のパラメーターです)。要件. この制限で問題を持ち出さないでください. デリゲートは baseType の最初のパラメータを受け取ります.これは, ユーザーが型を構築しようとする前に与えることができます.
ただし、型によって満たされるインターフェイス メンバーのデリゲート スタブを作成することは避けたいと思います。例えば
public class Goose
{
public void Quack()
{
// quack implementation details go here.
}
}
public interface IDuck
{
void Quack()
}
ここで私のビルダーに送っていただければ、グースがインターフェイスを満たしているため、 のスタブを作成しGoose
ません。new[]{typeof(IDuck)}
void Quack()
Goose は IDuck を実装していないため、インターフェイス マッピングはTypeBuilder
機能しません。構築する必要がある型ではサポートされていないため、新しく構築された型にインターフェイス マッピングを要求することはできません。
リモートで効率的な方法でこれを解決するにはどうすればよいですか? 一般に公開されているメンバーのみを調査する必要があり、型が同じメソッドを持つインターフェイスを明示的に実装している場合、それをターゲットとして使用すべきではないと想定できます。(例えば、Goose が実装されている場合void IGoose.Quack()
、それは のターゲットと見なされるべきではありませんvoid IDuck.Quack()
)。(とにかく、 BindingFlags.Public | BindingFlags.Instance
これらの要素を除外するには十分なはずです)。