从存储在其他变量 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# 中的类型转换变量的主要内容,如果未能解决你的问题,请参考以下文章

C#类型转换

将对象转换为存储在变量中的类

C#中的类型转换

C#中的类型转换

C#转换概叙

C#变量/数据类型转换/运算符使用