2012-04-02 6 views
9

Type.InvokeMemberを使用してリフレクションでメソッドを呼び出すことができます。しかしながら、何らかの理由で、オプションのパラメータを扱うことはありません。反射を使ってオプションのパラメータを持つメソッドを呼び出す

オプションのパラメータを考慮に入れた(おそらくDLRを使用して)メソッドを呼び出す方法がありますか?

+0

MethodInfoインスタンスを取得するには、type.GetMethod(...)を呼び出すことができます。その後、オプションのパラメータのためにmethodInfo.Invoke()を呼び出すことができます。Type.Missing –

+0

しかし、これは、メソッドのすべての可能なインスタンスを反復し、オプションで与えられたパラメータが適切であるかどうか試してみる必要がありますパラメーター。基本的に手作業でバインディングを行いますが、これは私が今やっていることです。 Type.InvokeMemberが90%進んで失敗するようです。重複を見ると、私は今手作業でそれをやっているようだ。 –

答えて

5

次の例では、何も返さない2つのパラメータを持つ関数を呼び出しています。 2番目のパラメータはオプションです。

MethodInfo mi = default(MethodInfo); 

// Loading the assembly 
Assembly reflectionAssemby = Assembly.LoadFile(@"C:\RelectionDLL.dll"); 

// Get type of class from loaded assembly 
Type reflectionClassType = reflectionAssemby.GetType("ReflectionDLL.ReflectionClass"); 

// Create instance of the class 
object objReflection = Activator.CreateInstance(reflectionClassType); 

mi = reflectionClassType.GetMethod("pub_Inst_NoReturn_Function"); 
mi.Invoke(objReflection, new object[] { value1, Type.Missing }); 
+1

お返事ありがとうございます。これの問題は、Type.Missingを渡すことができるように、オプションのパラメータが存在するかどうかを判断するためにメタデータを掘り下げる必要があることです。私は基本的に実行時にC#コンパイラのバインディング機能を複製するソリューションを期待していました。 –

+0

@JamesGaunt古い投稿ですが、最終的にこれを回避する方法を見つけましたか? –

+0

Wowはい非常に古い...私は道を見つけるのをやった...しかし、実行時に必要な依存関係に対してC#を直接コンパイルするためにRoslynコンパイラを使用するだけです。同じ問題を本当に解決するわけではありません。しかし、新しいコンパイラ機能を使用していくつかのサンプルコードをコンパイルし、ASTを検査してバインディングが終了したことを確認する方法はおそらくあります。 –

関連する問題