3

呼び出す 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' のパラメーターが間違っています。

それで、誰かがこれを機能させる正しい方法を教えてもらえますか?

ありがとう

4

3 に答える 3

2

申し訳ありませんが、これを行うだけであれば、次のように追加する必要がありました。

object[] Params = { Convert.ChangeType(call.ParValue, call.ParType)};

それは正常に動作しますが、呼び出しオブジェクトのジェネリック メソッドの要点は、使用時にキャストを回避することです。

于 2008-11-10T05:00:36.700 に答える
2

リフレクションを使用してメソッドを呼び出している場合、とにかく効果的にキャストすることになります。ここでは、ジェネリックの速度の利点もコンパイル時の型の安全性の利点もありません。ジェネリックを使用することで、自分に有利に働いているとは思いません。

ジェネリックは、少なくともどこかで、コンパイル時に型が静的にわかっている場合に役立ちます。プロパティを持っているという事実は、ジェネリックのポイントに反します。ParType

于 2008-11-10T06:53:12.370 に答える
2

文字列(「1」)を10進数にキャストすることはできません。ジェネリックバージョンがそれを知っているとは思えない場合でも、参照を保持するキャストを実行しようとします。 ' 演算子の変換が必要です (これらは C# で構文を共有していますが、大きく異なります)。

基本的に、ここでは Convert.ChangeType が唯一の賢明なオプションだと思います。

ジェネリックを介して演算子変換を使用できるようにするコードがいくつかありますが、文字列と小数の間で演算子変換がないため、役に立ちません。

于 2008-11-10T06:42:13.997 に答える