2012-02-10 11 views
0

を動的バインディング呼び出して、私はこの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メソッドを持っている私が持っているservice.Now私のウェブでありますクライアント側でこのWebメソッドを動的に呼び出します。 私は通常のパラメータを持つWebメソッドを呼び出す方法を知っていますthis wayを使用して、私はどのようにオブジェクトのパラメータ関数を呼び出すか分からない。あなたは次の行にリンクされている記事で

答えて

0

は、Webメソッドを呼び出します。

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

argsパラメータは、Webメソッドに渡されるパラメータが含まれている必要がありobject[]です。

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

、その後、メソッドに渡される引数の配列の構築:で

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

UPDATEをあなたの特定のケースでは、3つの要素が含まれているためにそれを必要としますWebサービスで定義されているUserMasterおよびUserEmailのクラスを参照するには、インポート時にクライアントプロキシによって生成されたすべてのタイプを公開する必要があるかもしれませんWebサービスを使用し、リフレクションを使用します。元の例では非公開であるクラスにはDictionary<string, Type> availableTypes;というプロパティがあります。あなたは公開することができますし、あなたはそれらのタイプにアクセスできるようになります。だから、

WebServiceInvoker呼び出しは=新しいWebServiceInvoker(新しいウリ( "の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にあります。実行時にこれらのオブジェクトをバインドすることはできますか? – Pankaj

+0

@Pankaj、私は答えを例で更新しました。 –

関連する問題