В статье, которую вы связали со следующей строкой, вызывается веб-метод:
(T)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, args);
Параметр args
- это object[]
, который должен содержать параметры, передаваемые вашему веб-методу.В вашем конкретном случае вам нужно, чтобы он содержал 3 элемента:
UserMaster objUser = ...
UserEmail objEmail = ...
string ouValue = ...
и затем строил массив аргументов, который будет передан методу:
object[] args = new object[] { objUser, objEmail, ouValue };
ОБНОВЛЕНИЕ:
Чтобы сослаться на классы UserMaster
и UserEmail
, которые определены в вашем веб-сервисе, вам может понадобиться предоставить все типы, сгенерированные прокси-клиентом при импорте веб-сервиса, а затем использовать отражение.В классе WebServiceInvoker
есть свойство Dictionary<string, Type> availableTypes;
, которое является приватным в исходном примере.Вы можете сделать его общедоступным, и тогда у вас будет доступ к этим типам.
Итак:
WebServiceInvoker invoker = new WebServiceInvoker (new Uri ("http://localhost/services/test.php"));
string service = "MyService";
string method = "SaveBusinessUserInfo";
Type userMasterType = invoker.AvailableTypes["FullNamespace.UserMaster"];
Type userEmailType = invoker.AvailableTypes["FullNamespace.UserEmail"];
object userMaster = Activator.CreateInstance(userMasterType);
object userEmail = Activator.CreateInstance(userEmailType);
// now that you have obtained the 2 instances you could set properties on them:
userMasterType.GetProperty("Username").SetValue(userMaster, "some username", null);
...
object[] args = new object[] { userMaster, userEmail, "foo bar" };
long result = invoker.InvokeMethod<long>(service, method, args);
Это можетбыстро превратиться в кошмар. Если вы используете .NET 4.0, вы можете использовать ключевое слово dynamic , чтобы упростить этот код.