在我的函数内部,我需要做类似的事情:
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
,string
,boolean
,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
。
感谢您的帮助!
答案 0 :(得分:1)
嗯,你可以......
set
以接受对象参数,并让类管理类型。foreach
块中设置逻辑。示例:
foreach (var parameter in parameters)
{
// int example
if (parameter.Value as int? != null)
smsg[parameter.Key].set((int)parameter.Value); // No error!
}
答案 1 :(得分:0)
您应该实现set(对象值)方法,该方法将确定参数类型和调用类型集(T值)。这是在这个方面使用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);
}
...
}
}