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);

set方法有很多可以接受的重载,int总共大约15 种方法。stringbooleanDateTime

重构后,我决定函数只使用参数列表而忽略其他变量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(object value) 方法,该方法将确定参数类型并调用类型化的 set(T value)。这是以这种方式使用 set 的唯一方法。

更新:如果您无权将其设置为库,则可以编写扩展方法

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 回答