2012-02-10 119 views
0

我面臨的一個問題,我有這樣的網絡方法調用動態綁定

[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;} 
} 

這所有的代碼是在我的網頁service.Now我必須在我的Web服務的Web方法在我的客戶端動態調用此Web方法。 我知道如何使用this way調用具有正常參數的web方法,但我不知道如何調用Object參數化函數。

回答

0

在你連接到下面一行文章調用Web方法:

(T)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, args); 

args參數是一個object[]必須包含的參數傳遞到你的Web方法。在您的特定情況下你需要它包含三個元素:

UserMaster objUser = ... 
UserEmail objEmail = ... 
string ouValue = ... 

,然後生成參數數組將被傳遞給方法:

object[] args = new object[] { objUser, objEmail, ouValue }; 

UPDATE:

在爲了引用在您的Web服務中定義的UserMasterUserEmail類,您可能需要公開在導入時由客戶端代理生成的所有類型使用Web服務,然後使用反射。 WebServiceInvoker類中的Dictionary<string, Type> availableTypes;屬性在原始示例中是私有的。您可以將其公開,然後您將可以訪問這些類型。

所以:

WebServiceInvoker調用=新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關鍵字來簡化此代碼。

+0

UserMaster,UserEmail類也在webservce.how我可以綁定這些對象在運行時.. – Pankaj 2012-02-10 07:31:32

+0

@Pankaj,我已經更新了我的答案與一個例子。 – 2012-02-10 07:43:32