0

関数内のどこかで、次のようなことをする必要があります。

        smsg["isin"].set(ii.ISIN);
        smsg["client_code"].set(Constants.CLIENT_CODE);
        smsg["type"].set(1);
        smsg["dir"].set(order.Operation == Side.Buy ? 1 : 2);
        smsg["amount"].set(order.Lots);
        smsg["price"].set(textPrice);
        smsg["ext_id"].set(0);

setintメソッドには、stringboolean、などを受け入れることができるオーバーロードがたくさんありDateTimeます。合計で約 15 のメソッドがあります。

リファクタリングの後、他の変数order iiなどを無視してパラメーターのリストのみを使用する関数を決定しました。問題は、関数の引数を介してこのパラメーターを転送する方法がわからないことです

    public uint ExecuteTransaction(Dictionary<string, object> parameters)
    {
        ....
        foreach (var parameter in parameters)
        {
            smsg[parameter.Key].set(parameter.Value);  // compile time error!
        }

コンパイラは使用するオーバーロードを認識していないため、次のようなエラーが発生します。

The best overloaded method match has some invalid arguments

マイ ディクショナリには、各パラメータの適切な値が含まれています。したがって、ブール値のパラメーターにはブール値などが含まれます。そのため、一般的な型を含むように Dictionary を宣言しましobjectた。

ご協力いただきありがとうございます!

4

2 に答える 2

1

ええと...

  1. setオブジェクトパラメータを受け入れるようにを変更し、クラス型を管理させます。
  2. foreachブロックにロジックを設定します。

例:

foreach (var parameter in parameters)         
{             
    // int example
    if (parameter.Value as int? != null)
        smsg[parameter.Key].set((int)parameter.Value);  // No error!         
} 
于 2012-08-31T20:01:28.640 に答える
0

パラメータの型を決定し、型指定された set(T value) を呼び出す set(object value) メソッドを実装する必要があります。これは、この方法で set を使用する唯一の方法です。

Upd: ライブラリとして設定するアクセス権がない場合は、拡張メソッドを記述できます

public static class Ext
{
  public static void set(this YOUR_LIB_TYPE lib, object value)
  {
    if(value is int)
    {
      lib.set((int) value);
    }
    else if(value is string)
    {
      lib.set((string) value);
    }
    ...
  }
}
于 2012-08-31T19:52:14.587 に答える