【问题标题】:Converting a variable from a type stored in other variable C#从存储在其他变量 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 是的,实际上我做了开关盒,但我正在寻找更好的方法。

标签: c# asp.net dynamic type-conversion


【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 2016-10-25
        • 2015-08-01
        • 2012-01-26
        • 2015-08-06
        相关资源
        最近更新 更多