无法投射C#

时间:2014-09-29 15:17:59

标签: c# .net casting

我的解决方案中有两个不同的项目。

在一个我有一个名为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; 

8 个答案:

答案 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不是MyClass2MyClass2不是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;
}