繁体   English   中英

是否可以在 C# 中内联将对象类型转换为另一种类型?

[英]Is possible to cast object type to another type inline in C#?

我在.Net 5 C#中有一个程序,它发出 HTTP 请求,内容 (JSON) 以特定类型反序列化(JsonNewtonsoft):

// Class definition
public class FooSerializerModel {

    [JsonProperty("latitude")] 
    public string Latitude { get; set; }

    [JsonProperty("longitude")]
    public string Longitude { get; set; }

}

// Deserialization
var fooJson = JsonConvert.DeserializeObject<FooSerializerModel>(response);

它工作正常,现在,我需要将fooJson变量类型转换为其他类型以将其传递给数据层方法

public class DataModel {

    public string Latitude { get; set; }

    public string Longitude { get; set; }

}

我需要这样的东西:

var data = fromJson as DataModel;

但我收到此错误:无法将类型FooSerializerModel转换为DataModel为什么?

我知道可以使用以下方法解决此问题:

var data = new DataModel() {
    Latitude = fromJson.Latitude,
    Longitude = fromJson.Longitude
}

但是如果我的类有 50 个属性,我将不得不一一分配,这将是更多的代码行,而且在明确执行时我可能会忘记其中的一些。

是否可以在一行上进行隐式赋值? 我试过这个:

var data = fromJson as DataModel; // Error

var data = (DataModel) fromJson; // Error

var data = (DataModel) (object) fromJson; // Exception 'Unable to cast object of type' when use 'dotnet run'

我记得如果您使用带有接口的类型并且很容易,则可以在 TypeScript 中执行此操作!

所有代码都在 Visual Studio 中进行了测试并正常工作。

var fooJson = JsonConvert.DeserializeObject<DataModel>(response);

一切都会好起来的,因为您并不真正需要 [JsonProperty] 属性。 您只需要修复您的启动程序,或者还有其他选项可以将小写转换为大写。

public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews()
    .AddNewtonsoftJson(options =>
           options.SerializerSettings.ContractResolver =
              new CamelCasePropertyNamesContractResolver());

     .... other code
}

但我什至不认为 json 属性会影响您的类,即使您将它们用于 MongoDB。 类是类,但属性是属性,它们过着完全独立的生活。

但如果你喜欢它,我可以提供这个

public class DataModel 
{

    public virtual string Latitude { get; set; }

    public virtual string Longitude { get; set; }

}

public class FooSerializerModel:DataModel
{

    [JsonProperty("latitude")]
    public override string Latitude { get; set; }

    [JsonProperty("longitude")]
    public override string Longitude { get; set; }

}

现在你可以编写你想要的代码了

var fooJson = JsonConvert.DeserializeObject<FooSerializerModel>(response);
DataModel data=fooJson;

假设您的 API 合同和数据层合同公开具有相同类型和名称的相同属性,您可以使用interface

public interface ICoordinates
{
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

public class FooSerializerModel : ICoordinates
{

    [JsonProperty("latitude")] 
    public string Latitude { get; set; }

    [JsonProperty("longitude")]
    public string Longitude { get; set; }

}

public class DataModel : ICoordinates
{
    [SampleDbAttribute(ColumnName: "col_latitude")]
    public string Latitude { get; set; }

    [SampleDbAttribute(ColumnName: "col_longitude")]
    public string Longitude { get; set; }
}

然后您可以在继承的类型之间进行转换,因为它们都实现了相同的接口:

// Deserialization
var fooJson = JsonConvert.DeserializeObject<FooSerializerModel>(response);

var data = fromJson as DataModel;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM