我面临一个问题,我的web服务中有一个类似的web方法
[WebMethod]
public long SaveBusinessUserInfo(UserMaster objUser, UserEmail objEmail,string ouValue)
{
// Saving user info in Database
}
public Class UserMaster
{
public string Username{get;set;}
public string Password{get;set;}
public string Email{get;set;}
}
public Class UserEmail
{
public string Id{get;set;}
public string Email{get;set;}
public string Country{get;set;}
}
这些代码都在我的web服务中。现在,我必须在客户端动态调用这个web方法。我知道如何用这种方式调用一个具有正常参数的web方法,但我不知道如何调用Object parameterize函数。
在本文中,您链接到以下行调用web方法:
(T)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, args);
args
参数是一个object[]
,它必须包含要传递给web方法的参数。在您的特定情况下,您需要它包含3个元素:
UserMaster objUser = ...
UserEmail objEmail = ...
string ouValue = ...
然后构建将传递给方法的自变量数组:
object[] args = new object[] { objUser, objEmail, ouValue };
更新:
为了引用web服务中定义的UserMaster
和UserEmail
类,您可能需要在导入web服务时公开客户端代理生成的所有类型,然后使用反射。WebServiceInvoker
类中有一个Dictionary<string, Type> availableTypes;
属性,它在原始示例中是私有的。你可以公开它,然后你就可以访问这些类型。
因此:
WebServiceInvoker invoker=新WebServiceInvoker(新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关键字来简化此代码。