2010-08-14 2 views
1

я получил себе в рассоле, и могу использовать помощь гуру ...Определение универсального типа во время выполнения в нетипичном классе

У меня есть журнал, который записывает данные для различных типов:

Journal(Of ParentT) 

- родитель может быть Customer, Address, другие классы

конструктор журнала требует знания параметра Тип:

Public Sub New(Parent as ParentT) 

В моей потребляющей форме, я беру журнал в конструкторе:

Public Sub DisplayForm(Journal as object) 

На данный момент, я не могу определить, какой тип журнал для. Я рассмотрел использование Reflection с помощью MethodInfo>MakeGenericMethod, DynamicMethod, делегатов и т. Д., Но не нашел работоспособного решения.

Я готов рассмотреть наиболее любой вариант на данный момент ...

ответ

1

я, возможно, неправильно понял вопрос, но если я правильно понимаю, Journal это на самом деле общий класс с общим параметром ParentT; это только то, что ссылка на экземпляр Journal<ParentT> имеет не общий тип System.Object. В этом случае, следующий метод должен работать нормально:

System.Type.GetGenericArguments

Извините, что этот код в C#, но:

object obj = new List<int>(); 
Console.WriteLine(obj.GetType().GetGenericArguments().First().ToString()); 

Выход:

System.Int32 

В вашем случае, вам может понадобиться что-то вроде:

Type journalGenericType = myJournal.GetType().GetGenericArguments().First(); 

if (journalGenericType == typeof(Customer)) 
{ 
    ... 
} 
else 
{ 
    ... 
} 
+0

Вау - Я часами искал это! Благодарю. – grefly

+0

@grefly: Отлично. Вы уверены, что не можете изменить дизайн, чтобы не требовать отражения? – Ani

+0

Я должен принять решение в IoC на основе типа Журнала - (я сделал * не * одобряю Конвенцию по Конфигурации!) - так, как бы изменилось это изменение дизайна? Я открыт для предложений/рекомендаций ... – grefly

0

Я знаю, что я немного опоздал на эту вечеринку, но я думал, что буду взвешивать.

Существует несколько неодинаковых подходов, которые вы могли бы использовать здесь.

Этот DisplayMethod вызов, который вы передаете в журнал, не является конструктором вашей формы (в противном случае он будет называться New), поэтому я предполагаю, что это метод, который определяет, какую форму загрузить для отображения журнала.

Если да, то вы можете просто добавить общий параметр для этого вызова метода следующим образом:

Public Sub DisplayForm(Of ParentT)(Journal As Journal(Of ParentT)) 
    Dim JournalParentType = GetType(ParentT) 
    '... 
End Sub 

Поскольку вы используете IoC вы можете даже пойти на один шаг дальше. Что-то вроде этого:

Public Sub DisplayForm(Of ParentT)(Journal As Journal(Of ParentT)) 
    Dim form = ioc.Resolve(Of IForm(Of ParentT)) 
    form.DataSource = Journal.Parent 
    form.Show() 
End Sub 

Конечно, вы должны были бы определить свой собственный IForm(Of T) интерфейс, чтобы сделать эту работу - но теперь нет отражения требуется.

Другой подход состоял бы в том, чтобы иметь базовый класс JournalJournal(Of ParentT) и иметь свойство ParentType на Journal. В качестве альтернативы вы можете иметь интерфейс IJournal, который делает то же самое.

Смежные вопросы