2010-06-02 3 views
0

У меня есть два объекта. Объект A и объект B.C# Преобразование типа

Объект A - это экземпляр класса, созданного из нескольких файлов XSD. Использовал xsd.exe/c и скомпилировал их. Теперь у меня есть мой новый объект.

У меня также есть веб-сервис, возвращая что-то очень похожее на объект А. Так что сейчас у меня есть кое-что вдоль линий этого:

WebService.foo myResponseObj = MyService.GetObject(inData); 
MyFramework.foo myClientObj = new MyFramework.foo(); 

То, что я хочу сделать, это это

myClientObj = (MyFramework.foo)myResponseObj 

Однако это не очень нравится. Говорит, «Не удается неявно преобразовать MyFramework.foo [] для WebService.foo []

Любые идеи о том, как решить эту проблему? Объект довольно велик, и они в основном идентичны.

+0

Если они достаточно похожи, то это возможность отказаться от класса, генерируемое из XSD-файлов и просто использовать класс веб-службы, прокси-сервера, а? –

ответ

3

Как получить извлечение интерфейса (щелкните правой кнопкой мыши по одному классу, выберите Refactor-> Extract Interface) и примените этот интерфейс к обоим классам?

Так это будет выглядеть примерно так:

namespace WebService 
{ 
    public class foo : IExtractedInterface 
} 

и

namespace MyFramework 
{ 
    public class foo : IExtractedInterface 
} 

тогда Вы должны быть в состоянии сделать:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj; 
1

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

вы можете вызвать этот метод в Array.ConvertAll.

+0

Вот чего я боялся/надеялся избежать. благодаря –

3

Оба объекта должны наследовать от того же интерфейса для того, чтобы успешно выполнить бросок у вас есть Вы можете посмотреть, как вытащить общий метод (ы) yo U нужно в интерфейс, который может быть реализован в обоих классах, таким образом, вы можете просто применить к типу интерфейса, а затем получить доступ к этим методам, а не ко всему объекту.

Наслаждайтесь!

1

Их быть "в основном идентичны" является недостаточным. Вы можете использовать только два объекта, если они совместимы с типом, что означает, что они имеют общий потомок, а фактические типы действительны для кастинга.

Например, следующие работы если Circle является потомком Shape:

Shape x = new Circle(); 
Circle y = (Circle)x; 

Однако, следующее будет не работы событие, если ClassA и ClassB имеют то же поле, но на самом деле не происходят от друг друга:

ClassA a = new ClassA(); 
ClassB b = (ClassA)a; 

Возможно, было бы целесообразно, чтобы оба они реализовали общий интерфейс, затем вы можете этот интерфейс и использовать их так, как вы хотите.

0

Если это массив, который предлагает вам цитата, вам необходимо выполнить итерацию через коллекцию ответов и добавить объекты-члены в коллекцию клиентов.

1

Это в основном было answered already. Однако следует отметить, что в дополнение к тому, что это был дан ответ здесь, есть небольшая надежда обеспечивается .NET 4 в новой «Тип эквивалентности» особенность:

Заметим, однако, что C# 4 будет поддерживать ограниченную форму структурная типизация на интерфейсах . См. http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-of-deploying-primary-interop-assemblies.aspx.

Это довольно продвинутый .NET-foo.

1

Если вы используете стандартный инструмент wsdl.exe для создания прокси-сервера и поддерживающих классов, то я считаю, что он генерирует код как частичные классы. Если это ваша ситуация, вы можете вставить свой собственный оператор неявного преобразования в один из типов. Например, предположим, что вы ваш класс MyService.foo определен в файле «MyService \ foo.cs», как показано ниже:

namespace MyService 
{ 
    public partial class foo 
    { 
     public string PropertyA { get; set; } 
     public string PropertyB { get; set; } 
     public string PropertyC { get; set; } 
     // ... 
    } 
} 

И у вас есть класс MyFramework.foo определен в файле «MyFramework \ Foo. CS», как показано ниже:

namespace MyFramework 
{ 
    public class foo 
    { 
     public string PropertyA { get; set; } 
     public string PropertyB { get; set; } 
     public string PropertyC { get; set; } 
     // ... 
    } 
} 

Затем вы можете создать отдельный файл, скажем„MyService \ foo.conversion.cs“, как показано ниже:

namespace MyService 
{ 
    partial class foo 
    { 
     public static implicit operator MyFramework.foo(foo input) 
     { 
      return new MyFramework.foo 
      { 
       PropertyA = input.PropertyA, 
       PropertyB = input.PropertyB, 
       PropertyC = input.PropertyC, 
       // ... 
      }; 
     } 
    } 
} 

И что позволит вам написать большинство ваш код с помощью MyService.foo объект, как если бы это был объект MyFramework.foo. Следующий код компилируется с помощью данной установки:

 MyService.foo x = new MyService.foo(); 

     MyFramework.foo y = x;