如何使用object.GetType()将object对象转换为其原始数据类型
解决方案
你尝试的(object.GetType())object写法无法生效是因为C#的强制类型转换要求转换目标类型在编译期就必须确定,不能用运行时才能获取到的Type实例作为转换目标。
针对你当前遇到的枚举值需要转底层数值的场景,只需要在处理非字符串值时,先判断值是否为枚举类型,是的话先转换为其对应的底层数值即可,修改后的代码如下:
static string QueryCosmos(Dictionary<string, object> parameters) { var sb = new StringBuilder($"SELECT * FROM c WHERE "); foreach (var p in parameters) { object processedValue = p.Value; // 枚举类型特殊处理,转成底层数值 if (p.Value != null && p.Value.GetType().IsEnum) { processedValue = Convert.ChangeType(p.Value, Enum.GetUnderlyingType(p.Value.GetType())); } if (!(processedValue is string)) { // 处理非字符串数据类型 var value = processedValue == null ? "null" : processedValue.ToString().ToLower(); sb.Append($"c.{p.Key} = {value} and "); } else { sb.Append($"c.{p.Key} = '{processedValue}' and "); } } return sb.ToString().Substring(0, sb.ToString().LastIndexOf(" and ")); }
- 如果有其他自定义类型需要特殊处理,也可以参考枚举的处理逻辑,增加对应的类型判断分支即可
- 直接拼接查询字符串存在注入风险,正式环境更推荐使用Cosmos DB原生的参数化查询能力,将参数值和查询语句分开传递,避免注入问题同时也不需要手动处理不同类型的序列化逻辑
内容的提问来源于stack exchange,提问作者chary
相关产品推荐
相关产品推荐

