2014-09-29 84 views
3

我在我的解决方案中有2个不同的项目。无法投射C#

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

你试图做的事情是不可能的 – thumbmunkeys 2014-09-29 15:19:49

+0

MyClass1是MyClass2的一个子类,或者相反? – Yann 2014-09-29 15:19:53

+0

你得到的错误是“这里是它死亡的地方”? – duDE 2014-09-29 15:20:03

回答

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并通过本地支持:将其放入可由两个项目引用的项目中。如果一个项目应该引用另一个项目,那么做;否则,创建第三个项目作为库。

0

只是因为他们同样实现你不能投的对象。他们必须从相同的基类或相同的接口继承,或者是彼此的子类(然后您只能从子类转换为父类)。

0

在一个我有一个类叫做MyClass1,而在另一个我有 MyClass2这些类除了名字都是相同的。

MyClass1MyClass2MyClass2MyClass1。你不能投一个到另一个。你需要映射它们。基本上对于每个属性,将值从一个实例设置到另一个实例。

11

你试图做的事是不可能的。即使这些类具有相同的内容,它们仍然是不同的类型。

你可以做的是:

  • 创建一个接口与所有的2种类型之间共享的东西
  • 让你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 }; 
    } 
} 
+0

请注意,这些强制转换操作符要求编译器知道旧对象是该类型的,而不仅仅是“对象”(如提问者的代码)。如果他有(更明智的)“名单”等,这将是一个工作的答案。 – 2014-09-29 15:26:15

+0

FWIW,我不喜欢转换操作符,除了在某些情况下(如数字类型):除了最后一条评论的限制之外,与静态方法相比,它们不易发现(无IntelliSense),更容易陷入重构,并且类型更安全(因为它们与几乎通用的投射共享语法)。我已经看到它建议他们使用一种静态方法来完成同样的事情,这通常会让我说:“我将使用静态方法,毕竟不需要转换。” – 2014-09-29 15:31:17

+1

没错。假设OP有一个 – 2014-09-29 15:32:52

1

这些类,但在所有的名字相同。

没有。这不是静态类型的工作原理。这些类可能是直观地类似的时候看着它们的实现,但就编译器而言他们是完全不同的。一个不能直接投向另一个。

List<Object> _tempObjects = new List<Objects>(); 

这增加了第三种类型的组合,Object。 A List<Object>可以包含任何东西就编译器而言,它不限于你的两个类。因此,绝对是无法转换为您班级的实例。

如果您的两个项目需要使用相同的类型,请将该类型提取到通用项目中,并且您的两个项目可以引用该通用项目。然后,你可以使用该类型无处不在:

List<MyClass1> _tempObjects = new List<MyClass1>(); 
0

如果MyClass1的和MyClass2意味着是相似的,你可以引入一个接口(姑且称之为是IMyClass),并有MyClass1的和MyClass2实施所述接口,然后你代码(在下面修改)将通过转换到共享接口来工作。

foreach(Object myObjectInput in _tempObjects) 
{ 
    IMyClass temp = (IMyClass) myObjectInput; 
}