вызвать метод с параметрами, полученными из универсального метода - PullRequest
3 голосов
/ 10 ноября 2008

У меня есть класс, в котором хранится имя вызываемого метода 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/' неверны.

Так может кто-нибудь указать мне правильный способ сделать эту работу?

Спасибо

Ответы [ 3 ]

2 голосов
/ 10 ноября 2008

Вы не можете просто привести строку ("1") к десятичному числу, и даже если вы можете сомневаться, что универсальная версия узнает об этом ... она попытается выполнить приведение к сохранению ссылок, где -поскольку вам нужно преобразование оператора (они имеют общий синтаксис в C #, но сильно отличаются).

Так что, в принципе, я думаю, что Convert.ChangeType - ваш единственный разумный вариант здесь.

У меня есть некоторый код , который позволит вам использовать преобразование операторов с помощью шаблонов, но нет преобразования операторов между строковым и десятичным, поэтому это не поможет.

2 голосов
/ 10 ноября 2008

Если вы вызываете метод с отражением, это в любом случае фактически приведет к приведению. Здесь у вас нет ни преимуществ по скорости, ни преимуществ безопасности при компиляции во время компиляции - я не думаю, что вы делаете себе какие-либо преимущества, используя его.

Обобщения полезны, когда вы действительно знаете тип статически во время компиляции, по крайней мере, где-то . Тот факт, что у вас есть свойство ParType, действительно идет вразрез с универсальностью.

2 голосов
/ 10 ноября 2008

Извините, я должен был добавить, что если я просто сделаю это:

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

это работает нормально, но весь смысл универсального метода в объекте вызова заключается в том, чтобы избежать приведения при использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...