0

ジェネリックパラメータオブジェクトを取り込むこのメソッドを作成しました。このメソッドは、さまざまなプロパティを持つさまざまなパラメータオブジェクトを受け入れます。「MethodName」プロパティの値に基づいて、その特定のパラメータオブジェクトのプロパティに基づいてURIを構築できるという考え方です。

リフレクションを使用して、「MethodName」という名前のプロパティの値を取得します。これはメソッドではなく、単なるプロパティ名です。

ケースステートメントでMethodNameプロパティの値を使用します。これは私の仕事を達成するための劣った方法のようです。特にMethodNamesの数が増えるにつれて。

以下は、caseステートメントを実装したソースです。どんな助けでもいただければ幸いです。


    public string ConstructBBAPIUri<T>(T parameters)
    {
        var methodName = "";
        var uri = "";
        var userId = "";
        long timeStamp = 0;
        var signature = "";
        var sessionKey = "";
        var newUserId = "";

        if (parameters != null)
        {
            methodName = parameters.GetType().GetProperty("MethodName").GetValue(parameters, null).ToString();

            switch (methodName)
            {
                case "user.login":
                    userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString();
                    timeStamp = Convert.ToInt64(parameters.GetType().GetProperty("TimeStamp").GetValue(parameters, null));
                    signature = GenerateBunchBallSignature(userId);

                    uri = "method=" + methodName + "&apiKey=" + apiKey + "&userid=" + userId + "&ts=" +
                          timeStamp + "&sig=" + signature;
                    break;

                case "user.modifyUserId":

                    //We shouldn't need the session key if user.login is being called first
                    userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString();
                    newUserId = parameters.GetType().GetProperty("NewUserId").GetValue(parameters, null).ToString();

                    uri = "method=" + methodName + "&sessionKey=" + sessionKey + "&oldUserId=" + userId +
                          "&newUserId=" + newUserId;
                    break;
            }
        }

        return uri;
    }
4

2 に答える 2

4

より良い設計は、クラスでURIの構築を委任することです。

  1. メソッドConstructBBAPIUri();を使用してインターフェースを作成します。
  2. コードにアクセスできる新規または既存のクラスのインターフェースを実装する
  3. 既存のクラスの場合、コードにアクセスできず、それらのクラスから継承してインターフェイスを実装します。うまくいけば、これらのクラスに必要なすべてのプロパティにアクセスできます。それ以外の場合は、リフレクションを使用します。
于 2012-11-15T02:43:28.223 に答える
0

オプションは辞書に関数を追加することですが、それが現在の方法よりもはるかに優れているかどうかはわかりません。また、混乱を招き、エラーが発生しやすくなります。

MaxShmelevが示唆していることが最善の解決策だと思います。可能であれば、渡される各クラスにインターフェイスを追加し、このメソッドに汎用制約を追加します。インターフェイスは、オブジェクトに実装されたときに、そのオブジェクトのシリアル化を処理するメソッドを定義します。

リストがそれほど長くない場合は、処理するさまざまなタイプごとにメソッドを追加し、各ケース内で1つのメソッド呼び出しを行うことができます。

于 2012-11-15T02:33:36.257 に答える