在不同命名空间的类之间强制类型转换

时间:2011-03-31 16:47:58

标签: c# asp.net c#-4.0 casting

如何在不同命名空间的类之间强制转换强制类型。

两个名称空间都有相同的类。

6 个答案:

答案 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同名的所有属性。

此外,如果您拥有其中一个类的代码,则可以检查您班级上的explicitimplicit重载。

答案 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.OrangeBar.Orange,但对于编译器,它可能也是AppleOrange。转换:

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