オプションのパラメーターを持つメソッドまたは可変数のパラメーターを渡すメソッドを使用する場合、そのメソッドを呼び出すparams
ときに、必要なパラメーターを挿入してくれるかどうかをコンパイラーに伝えていますか? オプションのパラメーターと params 配列は、呼び出されたコードではなく、呼び出し元のコードに挿入されます。(いくつかの詳細については、オプションのパラメーターに関する Eric Lipperts のブログ投稿の 1 つを参照してください)。
C# コンパイラを使用していないため、Reflection API はこれらのパラメーターを挿入しません。たとえば、リフレクションだけでなく、次の 2 つのアセンブリを使用してこれをテストすることもできますmethod(int X)
。それはコンパイルされ、dll はアセンブリ B によって参照されます。このアセンブリ B には への呼び出しが含まれていますmethod(42)
。これはうまくいきます!ここで、アセンブリ A を再コンパイルして署名をまたはに変更すると、アセンブリ B が動作しなくなります。これには無効な呼び出しが含まれています。それでも、アセンブリ B のソース コードは問題ありません。再コンパイルする必要があるだけです。method(int X, object bla=null)
method(int X, params object[] blas)
リフレクションは、たまたまオプションのパラメーター マジックをまったく実行しません。確かにそうかもしれませんが、そうではありません。リフレクションはこれをサポートしていませんが、DLR はサポートしているため、次のことがわかります...
回避策:可能であれば、C# キーワードを使用してみてくださいdynamic
(コンストラクターの場合、AFAIK ではありません) - C# 呼び出し規則をより厳密にエミュレートしようとし、オプションの名前付きパラメーターなどをサポートします。API の設定方法を変更する必要があるかもしれませんが、コンストラクターではなくメソッドを使用する必要があります。実際のコードを見ずに、より正確なアドバイスを与えることは困難です。
別の方法: 見た目から、プラグインをロードしようとしている可能性があります。.NET には、これを支援するための事前に作成されたインフラストラクチャ(アドインと拡張性) があり、これにより作業が容易になる場合があります。
(注:サンプルコードは不完全です-実際にはコンストラクターであると少し推測してmethod
いますが、実際のコードまたは少なくとも実際に失敗するスニペットを実際に投稿する必要があります)。