Помогите с Reflection
От: Аноним  
Дата: 19.09.09 12:48
Оценка:
Есть класс типа "Тип", например:


Type myDinamicType = myClass1; // Тут могут быть myClass2, myClass3....


Есть ДАО для моих классов (myClass1, myClass2 ...)


public class CommonDAO<classType> {}


Так как создать инстанс генерика с динамическим типом низя,
(вот так не получится CommonDAO<myDinamicType>)
прибегаем к рефлексии:


public static object CreateDinamicTypeDAO(Type typeDAO)
{
  Type daoType = Type.GetType("AssemblyName.CommonDAO'1");
  Type genericType = daoType.MakeGeneric(typeDAO);
  return Activator.CreateInstance(genericType);
}




и в коде я имею:

object myDAO = CreateDinamicTypeDAO(myDinamicType);


вопрос теперь состоит в том — как же юзать полученный объект?
Мне необходимо вызывать методы, описанные в CommonDAO<classType>, но имею я всего лишь объект типа object.
Приведение его хотябы к CommonDAO<object> возвращает null:

(myDAO as CommonDAO<object>) // это null


Помогите кто чем может )

Заранее спасибо!
Re: Помогите с Reflection
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.09.09 12:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>вопрос теперь состоит в том — как же юзать полученный объект?

А>Мне необходимо вызывать методы, описанные в CommonDAO<classType>, но имею я всего лишь объект типа object.
А>Приведение его хотябы к CommonDAO<object> возвращает null:

Экзистенциальных типов в C#, увы, нету.
Можно сделать MakeGenericMethod
Автор: nikov
Дата: 30.03.07
или вызывать каждый метод через рефлекшн (GetMethod(...).Invoke(...)).
Re: Помогите с Reflection
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.09.09 13:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>  Type daoType = Type.GetType("AssemblyName.CommonDAO'1");
А>


Да, и надо писать обратный апостроф ` или, еще лучше typeof(CommonDAO<>).
Re[2]: Помогите с Reflection
От: Аноним  
Дата: 19.09.09 13:29
Оценка:
Здравствуйте, nikov, Вы писали:



N>Да, и надо писать обратный апостроф ` или, еще лучше typeof(CommonDAO<>).


Простите — этого не понял. Код скописпастил из экзамплов. Из академического интереса прошу — поясните пожалуйста.
Re[3]: Помогите с Reflection
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.09.09 13:42
Оценка:
Здравствуйте, Аноним, Вы писали:

N>>Да, и надо писать обратный апостроф ` или, еще лучше typeof(CommonDAO<>).


А>Простите — этого не понял. Код скописпастил из экзамплов. Из академического интереса прошу — поясните пожалуйста.


Вместо GetType("CommonDAO'1") надо писать GetType("CommonDAO`1") или typeof(CommonDAO<>).
Re: Помогите с Reflection
От: Renny  
Дата: 19.09.09 19:18
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Приведение его хотябы к CommonDAO<object> возвращает null:


А>
А>(myDAO as CommonDAO<object>) // это null

А>


Все правильно, генерики нужно точно кастовать...
Буквально вчера мы решили такю же задачу так: вытащили из нужных классов интерфейс и кастовали objSelectable не к ExtendedEntityCollection<???> а к ISelectable.
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>
Re[2]: Помогите с Reflection
От: Аноним  
Дата: 21.09.09 07:05
Оценка:
Здравствуйте, Renny, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:


А>>Приведение его хотябы к CommonDAO<object> возвращает null:


А>>
А>>(myDAO as CommonDAO<object>) // это null

А>>


R>Все правильно, генерики нужно точно кастовать...

R>Буквально вчера мы решили такю же задачу так: вытащили из нужных классов интерфейс и кастовали objSelectable не к ExtendedEntityCollection<???> а к ISelectable.

А можно подробнее
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.