如何在不同命名空间的类之间强制转换强制类型。
两个名称空间都有相同的类。
答案 0 :(得分:7)
您无法将对象强制转换为不属于的类型。如果它属于不同的命名空间,则它不是同一个类。您必须创建转换器:
public static Namespace1.SomeClass Convert(Namespace2.SomeClass someClass) {
Namespace1.SomeClass rtn = new Namespace1.SomeClass();
rtn.SomeProp = someClass.SomeProp;
rtn.SomeOtherProp = someClass.SomeOtherProp;
return rtn;
}
你甚至可以使用反射来设置Namespace1.SomeClass上与Namespace2.SomeClass同名的所有属性。
答案 1 :(得分:3)
您可以创建通用转换器,这样您每次需要投射不同类型的对象时都不必这样做,
T ConvertObject<T>(object M) where T : class
{
// Serialize the original object to json
// Desarialize the json object to the new type
var obj = JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(M));
return obj;
}
// Test ObjectToCast is type Namespace1.Class, obj is Namespace2
Namespace2.Class obj = ConvertObject<Namespace2.Class>(ObjectToCast);
假设两个类都相同,这将起作用。
答案 2 :(得分:2)
即使类的代码完全相同,也无法从Type转换为其他Type。
您可以创建一个Converter
能够在两种类型之间进行转换,或者在两个类实现中提供隐式/显式转换,或者最终可以尝试Automapper。
答案 3 :(得分:0)
您需要限定类型:
namespace Foo
{
class Bar {}
}
namespace Baz
{
class Bar {}
}
Foo.Bar x = new Foo.Bar();
Baz.Bar y = (Baz.Bar)x;
当然,除非定义了转换,否则这将失败。
答案 4 :(得分:0)
这是不可能的。类型包括其名称空间作为其全名的一部分。
它像斯普林菲尔德镇:同名,但来自不同的州。它们都不同。
一种可能的方法是重载其中一种类型的强制转换操作符,以便它们可以转换为另一种类型。它不是真正的演员,因为结果将是创建一个具有相同值的新对象。
public static explicit operator Massachusetts.Springfield(Illinois.Springfield town)
{
return new Massachusetts.Springfield(town); // or any other code to copy the fields from one type to the other
}
答案 5 :(得分:-2)
这两个类具有相同名称的事实对编译器没有任何意义。您可能有Foo.Orange
和Bar.Orange
,但对于编译器,它可能也是Apple
和Orange
。转换:
namespace Foo
{
public class Orange{}
public static explicit operator Foo.Orange(Bar.Orange) { // conversion code }
}
namespace Bar
{
public class Orange{}
public static explicit operator Bar.Orange(Foo.Orange) { // conversion code }
}
// somewhere else
Foo.Orange o = new Foo.Orange();
Bar.Orange bar = (Bar.Orange)o; // and vice-versa