求c# WebApi动态传参的最佳实践

我目前是这样做:

[HttpPost]
void Foo(Dictionary<string,object> prm)
{
    var sql = "whatever";
    var sqlPrms = new List<SqlParameter>();

    if (prm.TryGetValue("Condition1",out var c1))
    {
        sql += " and Condition1=@c1";
        sqlPrms.Add(new SqlParameter("c1", c1));
    }

    if (prm.TryGetValue("Condition2", out var c2))
    {
        sql += " and Condition2=@c2";
        sqlPrms.Add(new SqlParameter("c2", c2));
    }

    ExecuteSql(sql, sqlPrms);
}

prm是不确定的条件集合,所以我不能定义一个明确的类,但是用Dictionary的话,问题在于Value只能是object类型,这样在框架进行json反序列化时,可能得不到正确的类型,比如[1,2,3]不会得到int[],所以我想请教这种情况成熟的做法是怎样的?

爆栈镜像:https://stackoverflow.com/que...

阅读 2k
1 个回答

如果你的 JSON 序列化库用的是 Newtonsoft.Json,可以直接用 JToken 当 Value:

Dictionary<string, JToken> map;

if (map.TryGetValue("key1", out JToken val1))
{
    int actualVal = val1.ToObject<int>();
}
else if (map.TryGetValue("key2", out JToken val2))
{
    string[] actualVal = val2.ToObject<string[]>();
}

P.S. 我看你这里 Key 是确定的啊,不存在同一个 Key 即能是字符串又能是数组的情况,为啥不能定义明确的类?反序列化后你的条件判断里判断是否该字段是 null 就行了呀,是 null 就说明客户端没传呗。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进