Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在两种名称和内部结构相同但来自不同程序集的类型之间转换?_C#_.net - Fatal编程技术网

C# 如何在两种名称和内部结构相同但来自不同程序集的类型之间转换?

C# 如何在两种名称和内部结构相同但来自不同程序集的类型之间转换?,c#,.net,C#,.net,我得到了装配1和装配2。包含两种相同名称和相同内部结构的类型 部件3参照1和2,并创建其中一个的对象。现在我想将它从程序集2转换到另一个 以下是假代码: assembly1.namespace1.typeXXX obj1 = new assembly1.type1(); assembly2.namespace2.typeXXX obj2 = obj1; <=== error here assembly1.namespace1.typeXXX obj1=newassembly1.typ

我得到了装配1和装配2。包含两种相同名称和相同内部结构的类型

部件3参照1和2,并创建其中一个的对象。现在我想将它从程序集2转换到另一个

以下是假代码:

assembly1.namespace1.typeXXX obj1 = new assembly1.type1();
assembly2.namespace2.typeXXX obj2 = obj1;   <=== error here
assembly1.namespace1.typeXXX obj1=newassembly1.type1();
assembly2.namespace2.typeXXX obj2=obj1 您可以使用。
如果属性名称相同,则简单如下:

Mapper.CreateMap<assembly1.type1, assembly2.type1>();
var obj2 = Mapper.Map<assembly1.type1, assembly2.type1>(obj1);
Mapper.CreateMap();
var obj2=Mapper.Map(obj1);

这两种类型不同,因为它们位于不同的程序集中,您必须将属性复制到属性。

您可以定义,但我认为在这种情况下,这只会增加混乱。我的问题是,为什么定义了两个相同(但不同)的类?为什么不用其中一个呢

另一种选择是在类型之间映射。如果您无法控制其源代码,可以使用扩展方法:

public static class TypeOneExtensions
{ 
    public static TypeTwo AsTypeTwo(this TypeOne typeOne)
    {
        return new TypeTwo
        {
            PropertyA = typeOne.PropertyA,
            PropertyB = typeOne.PropertyB,
            ...
        };
    }
}

请注意,这会创建一个新的
TypeTwo
实例,因此您对它所做的更改不会反映在原始
TypeOne
实例中。

我得到了一个脏的解决方案:


使用XML序列化obj1,侵入XML并将“namespace1”替换为“namespace2”。然后将XML反序列化为obj2。

同样的问题也发生在我身上

这段代码也许可以帮助你

using type1=assembly1.namespace1.typeXXX;
using type2=assembly2.namespace2.typeXXX;

或者,您可以阅读

这两种类型来自第三方,我无法控制它们。在这种情况下,我会按照@Daniel Hilgarth的建议,使用AutoMapper或自定义映射方法(可能作为扩展方法)。谢谢,但我不想使用第三方工具。您可以使用已经准备好并正在工作的工具,或者您投入精力,自己编写完全相同的功能。没有内置的方式。“谢谢,但我不想使用第三方工具”。。。你的政策是胡说八道。NET是第三方。正如您在一条评论中所说,您的两个对象是第三方。我想,你只需要重新发明轮子,而不想让人觉得你居高临下。。。如果这是强加给你的政策,我会建议你非常努力地后退,因为制定这一政策的人显然没有编程专业知识……哎哟。。。性能考虑因素等?仅仅因为不想使用第三方工具就使用它是胡说八道……好主意,但在他的情况下不起作用,因为类型的完整限定名是不同的(名称空间1名称空间2)