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

如何实现C#工厂方法在同结构不同命名空间类间转换并保留数据

解决方法

你的核心问题是转换方法没有接收要转换的源对象实例,而是直接创建了新的类实例(比如MyFirstClass()),根本拿不到实际要转换的数据。另外代码里还有语法错误和拼写问题,下面是修正后的完整实现:

修正后的代码

namespace MyMainNameSpace
{
    using MySubNameSpace;
    using MyOtherSubNameSpace;

    public static class FactoryClass
    {
        // 把MyFirstClass实例转换成MySecondClass
        public static MySecondClass ConvertToSecondClass(MyFirstClass source)
        {
            return new MySecondClass()
            {
                Attr1 = source.Attr1,
                Attr2 = source.Attr2
            };
        }

        // 把MySecondClass实例转换成MyFirstClass(修正方法名拼写错误:CLass → Class)
        public static MyFirstClass ConvertToFirstClass(MySecondClass source)
        {
            return new MyFirstClass()
            {
                Attr1 = source.Attr1,
                Attr2 = source.Attr2
            };
        }
    }
}

namespace MyOtherSubNameSpace
{
    public class MySecondClass
    {
        public required string Attr1 { get; set; }
        public required string Attr2 { get; set; }
    }
}

namespace MySubNameSpace
{
    public class MyFirstClass
    {
        public required string Attr1 { get; set; }
        public required string Attr2 { get; set; }
    }
}

关键修改点说明

  • 给每个转换方法添加源对象参数:比如ConvertToSecondClass接收MyFirstClass source,这样才能获取到要转换的实际数据。
  • 用source.Attr1、source.Attr2直接读取源对象的属性值,赋值给新创建的目标类实例的对应属性。
  • 修正方法名拼写错误:ConvertToFirstCLass改为ConvertToFirstClass(大写L改成小写l)。
  • 修正对象初始化器语法错误:把属性后的分号;改成逗号,(对象初始化器中多个属性用逗号分隔)。

使用示例

// 创建MyFirstClass实例
var firstObj = new MyFirstClass() { Attr1 = "Value1", Attr2 = "Value2" };

// 转换成MySecondClass
var secondObj = FactoryClass.ConvertToSecondClass(firstObj);

// 验证属性值是否保留
Console.WriteLine(secondObj.Attr1); // 输出 "Value1"
Console.WriteLine(secondObj.Attr2); // 输出 "Value2"

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:27:45