Estevão C Souza Ответов: 4

Как определить универсальный тип во время выполнения?


- Привет!

У меня есть следующий сценарий:
public class Envelope
{

public string MessageId {get;}

public abstract Stream GetStream() 

}


public class Envelope<T> : Envelope
{
public T Body {get;}
}


У меня есть еще 2 класса под названием MessageBus и MessageSender, которые отвечают за управление и передачу сообщения всем службам приложений.

public class MessageBus
{

public void Send(Envelope message)
{
sender.Dispatch(message);
}

}

public class MessageSender
{

public void Dispatch(Envelope message)
{

// THE PROBLEM IS HERE!!!!!
// HOW DO I IDENTIFY THE TYPE OF BODY? 
// On Envelope (base class) the property Body is missing and i can't get the type 
// to try create instance of change type .. and i need to pass body as parameter to 
// another method
}
}


Извините за мой плохой английский и большое вам спасибо за ваше время :)

Что я уже пробовал:

Рефлексия может быть работой, но я пытаюсь решить ее более "элегантным" способом.

4 Ответов

Рейтинг:
23

Philippe Mori

Вероятно, вам следует добавить следующую функцию в свой Envelope класс:

public abstract Type GetBodyType();


А затем реализовать его в производном классе Envelope<T>:
return typeof(T);


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


Рейтинг:
2

Rob Philpott

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

Более того, предполагая, что для отправки этой штуки по шине сообщений потребуется какая-то сериализация, возможно, существует базовый интерфейс или что-то еще, что вы можете использовать в качестве типа тела?


Рейтинг:
0

Bernhard Hiller

Цитата:
и мне нужно передать тело в качестве параметра другому методу
Этот другой метод тоже должен быть универсальным; или, по крайней мере, принять тип, совместимый с T. В противном случае инкапсуляция в универсальном классе не имеет смысла.


Рейтинг:
0

ArunRajendra

Проверьте эту ссылку. Надеюсь, это даст вам ключ к разгадке.

c# - Как получить тип T из общего списка-переполнение стека[^]