我的解决方案中有两个不同的项目。
在一个我有一个名为MyClass1的类,而在另一个我有MyClass2 这些类除名称外都是相同的。
在一个项目中,我有一个对象列表。在运行期间,列表中填充了MyClass1对象 我们铸造了一个物体。
最后,我想将列表中的每个对象强制转换为MyClass2对象。
目前它抛出一个异常,说无法将MyClass1类型的对象强制转换为MyClass2。
我的代码:
List<Object> _tempObjects = new List<Objects>();
foreach(Object myObjectInput in _tempObjects)
{
MyClass2 temp = (MyClass2) myObjectInput; // here is where it dies
}
这两个类是相同的,只是名称不同。 我也尝试过:
MyClass2 temp = myObjectInput as MyClass2;
答案 0 :(得分:11)
施法并不是那样的。当将(静态地称为)object
的对象转换为另一种类型时,它必须已经是该类型的实例才能工作。也许您希望使用AutoMapper从一个转换为另一个,例如
Mapper.CreateMap<MyClass1, MyClass2>();
// later...
MyClass2 temp = Mapper.Map<MyClass2>(myObjectInput);
或者手动复制属性,可能在构造函数中:
public MyClass2(MyClass1 other)
{
this.SomeProperty = other.SomeProperty;
// etc
}
MyClass2 temp = new MyClass2((MyClass1)myObjectInput);
更有可能的是,你应该做的是让项目以.NET本身理解和支持的方式共享MyClass
:将它放在一个可以被两者引用的项目中项目。如果一个项目应该引用另一个,那就这样做;否则,创建第三个项目作为库。
答案 1 :(得分:11)
你想做的事是不可能的。即使类具有相同的内容,它们仍然是不同的类型。
你能做的是:
答案 2 :(得分:6)
在没有实现显式(或隐式)强制转换运算符的情况下,您不能简单地将一种类型转换为另一种类型。
首先,我要问你为什么要有两个相同的课程。但是,如果必须这样做,你必须在一个到另一个之间声明一个显式的强制转换:
public class Class1
{
public string Name { get; set; }
public static explicit operator Class1(Class2 cls)
{
return new Class1 { Name = cls.Name };
}
}
public class Class2
{
public string Name { get; set; }
public static explicit operator Class2(Class1 cls)
{
return new Class2 { Name = cls.Name };
}
}
答案 3 :(得分:1)
这些类除名称外都是相同的。
不。这不是静态类型的工作方式。在查看实现时,类可能直观类似,但就编译器而言,它们完全不同。一个人不能直接投射到另一个人身上。
List<Object> _tempObjects = new List<Objects>();
这为混合添加了第三种类型Object
。就编译器而言,List<Object>
可以包含任何,它不仅限于您的两个类。因此,绝对无法转换为您的类的实例。
如果您的两个项目需要使用相同的类型,请将该类型提取到一个公共项目中,并且您的两个项目可以引用该公共项目。然后你可以在任何地方使用这种类型:
List<MyClass1> _tempObjects = new List<MyClass1>();
答案 4 :(得分:0)
你不能仅仅因为它们的实现方式相同而投射对象。它们必须从相同的基类继承或从相同的接口继承,或者是彼此的子类(然后你只能从子类转换为父类)。
答案 5 :(得分:0)
在一个我有一个名为MyClass1的类,而在另一个我有 MyClass2这些类除名称外都是相同的。
但MyClass1
不是MyClass2
而MyClass2
不是MyClass1
。你不能把一个扔到另一个。你需要映射它们。基本上对于每个属性,将值从一个实例设置为另一个实例。
答案 6 :(得分:0)
在实现显式强制转换操作符之前,即使它们具有相同的实现,也无法强制转换这两个对象,或者类型是当前类型是派生自/来的。这是.NET中的一个铸造备忘单,请看http://www.codeproject.com/Articles/5044/Cheat-Sheet-Casting-in-VB-NET-and-C
答案 7 :(得分:0)
如果MyClass1和MyClass2相似,你可以引入一个接口(让我们调用它是IMyClass)并让MyClass1和MyClass2实现所述接口,然后你的代码(下面修改过的)可以通过转换到共享接口来工作。 / p>
foreach(Object myObjectInput in _tempObjects)
{
IMyClass temp = (IMyClass) myObjectInput;
}