具有对象参数的Web服务中的Web方法调用动态绑定

时间:2012-02-10 07:18:21

标签: c# reflection

我遇到了问题,我的网络服务中有一个像这样的网页方法

[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函数。

1 个答案:

答案 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服务中定义的UserMasterUserEmail类,您可能需要在导入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关键字来简化此代码。