我遇到了问题,我的网络服务中有一个像这样的网页方法
[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方法。 我知道如何使用this way调用具有普通参数的web方法,但我不知道如何调用Object parametrize函数。
答案 0 :(得分:0)
在链接到以下行的文章中,调用了Web方法:
(T)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, args);
args
参数是object[]
,必须包含要传递给您的网络方法的参数。在您的特定情况下,您需要它包含3个元素:
UserMaster objUser = ...
UserEmail objEmail = ...
string ouValue = ...
然后构建将传递给方法的arguments数组:
object[] args = new object[] { objUser, objEmail, ouValue };
更新:
为了引用Web服务中定义的UserMaster
和UserEmail
类,您可能需要在导入Web服务时公开客户端代理生成的所有类型,然后使用反射。 Dictionary<string, Type> availableTypes;
类中有一个WebServiceInvoker
属性,在原始示例中是私有的。您可以将其公开,然后您就可以访问这些类型。
所以:
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关键字来简化此代码。