无法投射C#

Joh*_*ohn 3 .net c# casting

我的解决方案中有2个不同的项目.

在一个我有一个名为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
}
Run Code Online (Sandbox Code Playgroud)

这两个类是相同的,只是名称不同.我也尝试过:

 MyClass2 temp = myObjectInput as MyClass2; 
Run Code Online (Sandbox Code Playgroud)

Tim*_* S. 11

投射不起作用.当将(静态地称为对象)转换object为另一种类型时,它必须已经是该类型的实例才能工作.也许你想用AutoMapper从一个转换到另一个,例如

Mapper.CreateMap<MyClass1, MyClass2>();

// later...
MyClass2 temp = Mapper.Map<MyClass2>(myObjectInput);
Run Code Online (Sandbox Code Playgroud)

或者手动复制属性,可能在构造函数中:

public MyClass2(MyClass1 other)
{
    this.SomeProperty = other.SomeProperty;
    // etc
}

MyClass2 temp = new MyClass2((MyClass1)myObjectInput);
Run Code Online (Sandbox Code Playgroud)

更有可能的是,你应该做的是让项目MyClass以.NET本身理解和支持的方式共享:将它放在一个可以被两个项目引用的项目中.如果一个项目应该引用另一个,那就这样做; 否则,创建第三个项目作为库.


thu*_*eys 11

你想要做的是不可能的.即使类具有相同的内容,它们仍然是不同的类型.

你能做的是:

  • 创建一个包含两种类型共享的所有内容的接口
  • 让你的2种类型实现该接口
  • 当您从列表中获取对象时,转换为此接口


Yuv*_*kov 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 };
    }
}
Run Code Online (Sandbox Code Playgroud)