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);

但是我的类型,示例中的十进制,是在 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”)转换为小数,即使您可以怀疑通用版本是否会知道它……它会尝试进行保留引用的转换,当您'd 需要一个运算符转换(它们在 C# 中共享语法,但非常不同)。

所以基本上,我认为 Convert.ChangeType 是你唯一明智的选择。

我确实有一些代码允许您通过泛型使用运算符转换,但是字符串和十进制之间没有运算符转换,所以它无济于事。

于 2008-11-10T06:42:13.997 回答