从存储在其他变量 C# 中的类型转换变量
Posted
技术标签:
【中文标题】从存储在其他变量 C# 中的类型转换变量【英文标题】:Converting a variable from a type stored in other variable C# 【发布时间】:2021-02-19 03:04:20 【问题描述】:我需要从存储在其他变量中的类型转换动态变量。
例如:
dynamic dynamicVar = 3;
string type = "double";
var valueConverted = (type) dynamicVar;
我知道这不起作用,但是有没有办法做这样的事情?
我正在接收这样的 JSON:
[
"name": "Parameter1",
"description": "Description",
"value": "Value",
"type": "string"
,
"name": "Parameter1",
"description": "Description",
"value": false,
"type": "boolean"
,
"name": "Parameter3",
"description": "Description",
"value": 3,
"type": "double"
]
我需要把这个 json 转换成这样的对象:
public class Parameters
public string Parameter1 get; set;
public bool Parameter2 get; set;
public double? Parameter3 get; set;
当我尝试存储 Parameter3 时,我收到了错误: 无法将 Int 转换为 Double
【问题讨论】:
C# 是静态类型的。我认为这样的事情在 c# 中是不可能的。但是你可以做一个 switch case 语句来实现。 这样的东西有什么实际用途?对我来说,看起来像xy problem,TBH。您能否提供有关实际使用/代码的更多信息? 我正在创建一个要在前端显示的参数列表,当我收到这个列表时,我必须存储输入的值。我将在 Mapper 类中使用此代码,将 Json 转换为 Object。 为什么不直接使用现有的 json 序列化器将 json 映射到模型类? @FrederikPietzko 是的,实际上我做了开关盒,但我正在寻找更好的方法。 【参考方案1】:如果我理解正确,您可以首先从your JSON 生成 JSON 架构:
var schema = JsonSchema.FromSampleJson("...");
然后您可以使用NJsonSchema 从中生成类。 HTH。
【讨论】:
【参考方案2】:您可以使用一些reflection 魔法来设置这些字段。像这样的东西(我使用 Newtonsoft Json.NET 作为 json 库):
class Parameters
public string Parameter1 get; set;
public bool Parameter2 get; set;
public double Parameter3 get; set;
public override string ToString()
return $"nameof(Parameter1): Parameter1, nameof(Parameter2): Parameter2, nameof(Parameter3): Parameter3";
var json = @" [
""name"": ""Parameter1"",
""description"": ""Description"",
""value"": ""Value"",
""type"": ""string""
,
""name"": ""Parameter2"",
""description"": ""Description"",
""value"": false,
""type"": ""boolean""
,
""name"": ""Parameter3"",
""description"": ""Description"",
""value"": 3,
""type"": ""double""
]";
var typeMap = new Dictionary<string, Type>
"double", typeof(double),
"boolean", typeof(bool),
"string", typeof(string),
;
var jArray = JArray.Parse(json);
var result = new Parameters();
var methodInfo = typeof(Newtonsoft.Json.Linq.Extensions).GetMethod("Value", 1, new []typeof(IEnumerable<JToken>));
foreach (var jObj in jArray)
var method = methodInfo.MakeGenericMethod(typeMap[jObj["type"].Value<string>()]);
var value = method.Invoke(null, new[] jObj["value"]);
typeof(Parameters).GetProperty(jObj["name"].Value<string>())
.SetValue(result, value);
Console.WriteLine(result); // prints "Parameter1: Value, Parameter2: False, Parameter3: 3"
这段代码可以通过不同类型的异常处理、缓存等得到很大改进,但应该让您大致了解如何处理您的任务(如果我理解正确的话)。
此外,如果您坚持使用 Json.NET 库,您可以考虑将其封装在 custom converter 中。
【讨论】:
【参考方案3】:试试这个:
dynamic dynamicVar = 3;
var valueConverted = default(dynamicVar.GetType()); //This will set the right type
valueConverted = dynamicVar;
【讨论】:
以上是关于从存储在其他变量 C# 中的类型转换变量的主要内容,如果未能解决你的问题,请参考以下文章