У меня есть класс, в котором хранится имя вызываемого метода 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: параметры для метода 'TestService.Hello' в URL 'http://localhost/MyTestingService/' неверны.
Так может кто-нибудь указать мне правильный способ сделать эту работу?
Спасибо