-1

私は次の問題を抱えています:

public class MyType
{
    public void method(int a, params object[] p){} 
    public void MyType()
    {
        method(5);
    }
}

コンストラクターを使用する場合はすべて問題ありませんが、使用しようとするとActivator.CreateInstance(MyType);

void Factory()
{
    string componentPath = "MyType.dll";
    Assembly component = Assembly.LoadFrom(componentPath);
    Type myType= component.GetType("MyType");
    Activator.CreateInstance(myType);
}

例外MyType.method(int32)が見つからない場合は失敗します。params object[] pメソッドに追加する前に、すべてが正常に機能したことに注意してください。

ありがとうございました。

4

2 に答える 2

3

オプションのパラメーターを持つメソッドまたは可変数のパラメーターを渡すメソッドを使用する場合、そのメソッドを呼び出す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いますが、実際のコードまたは少なくとも実際に失敗するスニペットを実際に投稿する必要があります)。

于 2011-05-25T08:19:06.577 に答える
0

method() への呼び出しで少なくとも 2 つのパラメーターを渡す必要があるため、これは機能しません。params修飾子は「オプション」という意味ではありません。

于 2011-05-25T08:04:38.657 に答える