【发布时间】:2021-11-04 20:47:18
【问题描述】:
我有一个object 类型变量,我想将它转换为其原始数据类型。数据类型可以是任何类型(int、enum、class 等)
(object.GetType())object 不工作
已编辑:
我想再次将其转换为原始的原因,因为我正在构建一个带有多个参数的 cosmos db 查询
我有一个方法QueryCosmos(Dictionary<string, object> parameters),其中key是cosmos中的字段名,value是符合条件的字段的值(可以是任何数据类型)。
static string QueryCosmos(Dictionary<string, object> parameters)
{
var sb = new StringBuilder($"SELECT * FROM c WHERE ");
foreach (var p in parameters)
{
if (!(p.Value is string))
{
// this handles non-string data types
var value = p.Value == null ? "null" : p.Value.ToString().ToLower();
sb.Append($"c.{p.Key} = {value} and ");
}
else
{
sb.Append($"c.{p.Key} = '{p.Value}' and ");
}
}
return sb.ToString().Substring(0, sb.ToString().LastIndexOf(" and "));
}
我的问题是这行代码var value = p.Value == null ? "null" : p.Value.ToString().ToLower();
如果我传递 enum 类型,与 cosmos 中的数据不匹配。因为在cosmos中,这是存储为枚举的数值。我需要将其转换为 numeric 值。可以传递多种可能的enum 类型。这就是为什么我想要一种动态方式来转换为原始数据类型的原因
希望这能消除疑虑
【问题讨论】:
-
您可能有 X/Y 问题。您永远不需要在 C#/.NET 中从
Object向上转换。请发布与此问题相关的所有代码。 -
"我想将其转换为原始数据类型。" - 您为什么要这样做?您的程序将如何真正利用知道对象的运行时类型是什么?
-
我确定 cosmos 对参数有原生支持,无需将所有内容都分解为字符串。
-
@chary 您的
QueryCosmos方法容易受到 SQL 注入的攻击。这是一个重大的安全问题。 -
@chary 我已经更新了我的答案,以便它处理
Enum值(包括enum的所有大小)。
标签: c# reflection casting dynamic-cast targettype