呼び出す WS メソッドの名前と、サービスが受け取る唯一のパラメーターの型と値を格納するクラスがあります (パラメーターのコレクションになりますが、この例では単純にします)。
public class MethodCall
{
public string Method { get; set; }
public Type ParType { get; set; }
public string ParValue { get; set; }
public T CastedValue<T>()
{
return (T)Convert.ChangeType(ParValue, ParType);
}
}
メソッド名とパラメーターを受け取り、リフレクションを使用してメソッドを呼び出し、結果を返すメソッドがあります。次のように使用すると、それは正常に機能します。
callingclass.URL = url;
callingclass.Service = serviceName;
object[] Params = { (decimal)1 };
callingclass.CallMethod("Hello", Params);
しかし、この例の 10 進数の型は、MethodCall のインスタンスで指定されます。したがって、このコードがある場合:
MethodCall call = new MethodCall();
call.Method = "Hello";
call.ParType = typeof(decimal);
call.ParValue = "1";
オプション 1、コンパイルされません:
object[] Params = { (call.ParType)call.ParValue }; //Compilation error: The type or namespace name 'call' could not be found (are you missing a using directive or an assembly reference?)
オプション 2、どちらもコンパイルしません:
object[] Params = { call.CastedValue<call.ParType>() }; //Compilation error: Cannot implicitly convert type 'call.ParType' to 'object'
リフレクションを使用するオプション 3 はコンパイルされますが、サービスを呼び出すときに機能しません。
object[] Params = { typeof(MethodCall).GetMethod("CastedValue").MakeGenericMethod(call.ParType).Invoke(this, null) };
callingclass.CallMethod(call.Method, Params);
例外は: ConnectionLib.WsProxyParameterExeption: URL ' http://localhost/MyTestingService/ ' のメソッド 'TestService.Hello' のパラメーターが間違っています。
それで、誰かがこれを機能させる正しい方法を教えてもらえますか?
ありがとう