You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中能否实现不同类对象的内联转换,无需逐个属性赋值?

错误原因

C#属于标称类型系统,两个不存在继承关系、也没有预先定义类型转换运算符的类,即使属性结构完全一致,也无法直接进行强制类型转换或者as运算符转换。你之前尝试的直接强制转换写法本质是引用转换,要求两个类型在运行时存在继承/实现关系,因此会抛出转换失败的异常。
而TypeScript属于结构化类型系统,只要类型结构匹配就会判定为兼容,所以可以直接赋值,这是两类语言类型系统的核心差异。


可行的单行转换方案

方案1:使用AutoMapper对象映射库(适合属性多、频繁需要类型转换的场景)

AutoMapper是.NET生态最常用的对象映射库,属性名完全匹配的场景下无需手动编写映射规则,配置一次即可全局复用。

  1. 首先安装NuGet包 AutoMapper
  2. 全局配置(程序启动时执行一次即可):
var mapperConfig = new MapperConfiguration(cfg => {
    // 属性名完全匹配无需额外配置规则
    cfg.CreateMap<FooSerializerModel, DataModel>();
    // 可批量添加所有需要的映射规则
});
// 建议将mapper注入到DI容器中全局使用
IMapper mapper = mapperConfig.CreateMapper();
  1. 转换时仅需一行调用:
var data = mapper.Map<DataModel>(fromJson);

就算类有上百个属性,也不需要手动逐个赋值,不会出现遗漏。


方案2:基于Json序列化/反序列化实现转换(适合不想引入第三方依赖的轻量场景)

你已经在使用Newtonsoft.Json,可以直接通过两次序列化操作完成转换,仅需一行代码:

var data = JsonConvert.DeserializeObject<DataModel>(JsonConvert.SerializeObject(fromJson));

这个方案无需额外配置,缺点是性能略低于专用映射库,小体量对象使用无感知。


方案3:自定义隐式转换运算符(适合固定类型转换,后续调用无需额外依赖)

在源类型或目标类型中定义一次隐式转换规则,后续所有转换场景都可以直接赋值:

public class FooSerializerModel {
    [JsonProperty("latitude")] 
    public string Latitude { get; set; }
    [JsonProperty("longitude")]
    public string Longitude { get; set; }

    // 添加隐式转换运算符
    public static implicit operator DataModel(FooSerializerModel source)
    {
        return new DataModel
        {
            Latitude = source.Latitude,
            Longitude = source.Longitude
        };
    }
}

定义后可以直接用以下写法转换:

DataModel data = fromJson;
// 或者显式强制转换也支持
var data = (DataModel)fromJson;

内容的提问来源于stack exchange,提问作者Julián

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:15:03