如何解决从存储在其他变量C#中的类型转换变量
我需要从其他变量中存储的类型转换动态变量。
例如:
dynamic dynamicVar = 3;
string type = "double";
var valueConverted = (type) dynamicVar;
我知道这是行不通的,但是,有没有办法做类似的事情?
我正在接收这样的JSON:
[
{
"name": "Parameter1","description": "Description","value": "Value","type": "string"
},{
"name": "Parameter1","value": false,"type": "boolean"
},{
"name": "Parameter3","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
解决方法
如果我对您的理解正确,那么您首先可以从your JSON生成JSON模式:
var schema = JsonSchema.FromSampleJson("...");
然后,您可以使用NJsonSchema从中生成类。 HTH。
,您可以使用一些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"",""value"": false,""type"": ""boolean""
},{
""name"": ""Parameter3"",""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 lib,可以考虑将其封装在custom converter中。
,尝试一下:
dynamic dynamicVar = 3;
var valueConverted = default(dynamicVar.GetType()); //This will set the right type
valueConverted = dynamicVar;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。