Тип силы приведения между классами разных пространств имен - PullRequest
3 голосов
/ 31 марта 2011

Как происходит приведение типа Force между классами разных пространств имен.

Оба пространства имен имеют одинаковый класс.

Ответы [ 7 ]

7 голосов
/ 31 марта 2011

Вы не можете привести объект к типу, которым он не является.Если он принадлежит другому пространству имен, то это не тот же класс.Вам нужно будет создать конвертер:

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.

Также, еслиВы владеете кодом одного из классов, вы можете проверить перегрузку явного и неявного в вашем классе.

3 голосов
/ 19 апреля 2017

Вы можете создать универсальный конвертер, чтобы вам не приходилось делать это каждый раз, когда вам нужно привести объекты другого типа,

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 голосов
/ 31 марта 2011

Невозможно привести тип из типа к другому типу, даже если код класса точно такой же.обеспечить неявное / явное приведение внутри обеих реализаций классов или, в конце концов, вы можете попробовать Automapper .

0 голосов
/ 10 сентября 2015

Если оба класса сериализуемы, вы можете сериализовать первый объект в XML, изменить «пространство имен» в xml и снова десериализовать его.

0 голосов
/ 31 марта 2011

Тот факт, что два класса имеют одно и то же имя, ничего не значит для компилятора.У вас может быть 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
0 голосов
/ 31 марта 2011

Это невозможно.Тип включает свое пространство имен как часть своего полного имени.

Он похож на город Спрингфилд: то же имя, но из разных штатов.Все они разные.

Возможный подход - перегрузить оператор приведения одного типа, чтобы их можно было привести к другому типу.Это не будет настоящий актерский состав, поскольку в результате будет создан новый объект с тем же значением.

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
}
0 голосов
/ 31 марта 2011

Вам необходимо указать тип:

namespace Foo
{
   class Bar {}
}

namespace Baz
{
   class Bar {}
}

Foo.Bar x = new Foo.Bar();
Baz.Bar y = (Baz.Bar)x;

Конечно, это не получится, если не определено преобразование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...