Определение универсального типа во время выполнения в неуниверсальном классе - PullRequest
1 голос
/ 14 августа 2010

Я попал в рассол и мог бы воспользоваться помощью гуру ...

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

Journal(Of ParentT)

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

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

Public Sub New(Parent as ParentT)

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

Public Sub DisplayForm(Journal as object)

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

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

Ответы [ 2 ]

1 голос
/ 14 августа 2010

Возможно, я неправильно понял вопрос, но если я правильно понимаю, 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 голосов
/ 21 июня 2011

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

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

Этот 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), чтобы сделать эту работу - но теперь не требуется никакого отражения.

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

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