Страницы

Поиск по вопросам

вторник, 18 февраля 2020 г.

Динамическое установление типа в зависимости от условия

#c_sharp #типы_данных


Есть две сборки (service reference) в одном namespace OrderSendService. Обе имеют
класс Order:

public class Order
{
   public int id { get; set; }
   public string type { get; set; }
}


ServiceReference1 и ServiceReference2, это Service references, полученные на основе
wsdl. Мне нужно использовать оба этих референса. Сейчас  формируется объект  ServiceReference1.Order
и отправляется методом ServiceReference1.Send(). Возникла необходимость для отправки
использовать ServiceReference2.Send() и передавать этот же объект (при этом ServiceReference2.Send()
принимает объекты из своего namespace)

Возможно ли в зависимости от условия, установить тип объекту? Использую такой код:

dynamic obj;
if (condition)
{
   obj = new ServiceReference1.Order[10];
}
else
{
   obj = new ServiceReference2.Order[10];
}


(obj будет передаваться в методе Send() одного из wsdl-сервисов).

Неймспейсы сервисов:

OrderSendService.ServiceReference1
OrderSendService.ServiceReference2


При попытке доступа к свойству obj[0].id VS 2015 показывает ошибку:


  Missing compiler required member
  Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create


И возможно ли привести тип ServiceReference1.Order к ServiceReference2.Order?
    


Ответы

Ответ 1



Судя по всему, не хватало подключения библиотеки Microsoft.CSharp. Поскольку dynamic — внутри-C#-овская фича, ей нужна специальная поддержка. Проекты, созданные старыми версиями компилятора, не содержат ссылки на Microsoft.CSharp, поэтому ссылку иногда приходится добавлять вручную.

Ответ 2



Заведите для разных служб разные пространства имен. Вы искуственно создаете ситуацию, когда .NET не имеет возможности различить два типа Order в том месте кода, где они "видны". И возможно ли привести тип ServiceReference1.Order к ServiceReference2.Order Нет. public class OrderConverter { public static ServiceReference1.Order Convert(ServiceReference2.Order anOrder) { return new ServiceReference1.Order() { id = anOrder.id; type = anOrder.type; }; } public static ServiceReference2.Order Convert(ServiceReference1.Order anOrder) { return new ServiceReference2.Order() { id = anOrder.id; type = anOrder.type; }; } }

Комментариев нет:

Отправить комментарий