[英]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.