代码之家  ›  专栏  ›  技术社区  ›  tokyo0709

动态强制转换Json不会创建与显式强制转换相同的对象

  •  1
  • tokyo0709  · 技术社区  · 7 年前

    我遇到了这个问题,我需要将JSON反序列化为动态类型,现在我已经解决了这个问题,

    var typeObject = System.Reflection.Assembly.GetExecutingAssembly().GetType("SalesForceEndpoints.Models.BaseAccount");
    var accountToCreate = JsonConvert.DeserializeObject(body.Data.ToString(), typeObject);
    
    var result = client.Create(accountToCreate);  // This line fails because of the type
    

    我可以看到它成功地创建了一个自定义BaseCount类型的对象。然而,当我试图将其传递给我在Salesforce中使用的API时,它失败了。我对类型进行了显式转换测试,效果很好,

    var stronglyTypedAccountToCreate = JsonConvert.DeserializeObject<BaseAccount>(body.Data.ToString());
    
    var result2 = client.Create(stronglyTypedAccountToCreate); // This succeeds
    

    在Visual Studio中查看我的两个对象时,乍一看它们似乎是相同的,

    Object Comparison

    然后我在手表的“类型”栏下注意到了这一点,

    enter image description here

    动态强制转换对象列为

    对象{SalesForceEndpoints.Models.BaseCount}

    显式强制转换对象列为

    SalesForceEndpoints。模型。基本帐户

    我几乎可以肯定,这是阻止我成功执行调用的原因,有什么想法吗?这里出了什么问题,以及如何执行动态运行时转换来模拟显式编译时转换?


    ---编辑---

    我发现了问题的一部分。当我调用Create函数时,Create函数试图提取泛型类型,当它被动态强制转换时,它在这里作为对象而不是帐户。

    public IResponse<string> Create<T>(T obj) where T : new()
    {
        try
        {
            var typeName = typeof(T).Name.Replace("Base", "");
            var result = _api.Create(typeName, obj);
            return new SuccessResponse<string>(ResponseResult.Success, result);
        }
        catch (Exception ex)
        {
            return new FailureResponse<string>(ResponseResult.Failure, $"Unable to create record. | {ex.Message}");
        }
    }
    

    如果有人知道为什么对对象的动态强制转换是作为对象{ModelObject}而不仅仅是ModelObject来实现的,那还是有点奇怪。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Emre Kabaoglu    7 年前

    你应该改变它

    var typeName = typeof(T).Name.Replace("Base", "");
    

    var typeName = obj.GetType().Name.Replace("Base", "");
    

    因为 T 将评估为 System.Object ,您没有将已知类型传递给泛型函数,并且 T 停留在 系统对象 . 如果要使用泛型,应指定 T 在编译器时间内。