Есть класс типа "Тип", например:
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
Помогите кто чем может )
Заранее спасибо!
Здравствуйте, Аноним, Вы писали:
А>вопрос теперь состоит в том — как же юзать полученный объект?
А>Мне необходимо вызывать методы, описанные в CommonDAO<classType>, но имею я всего лишь объект типа object.
А>Приведение его хотябы к CommonDAO<object> возвращает null:
Экзистенциальных типов в C#, увы, нету.
Можно сделать
MakeGenericMethodАвтор: nikov
Дата: 30.03.07
или вызывать каждый метод через рефлекшн (GetMethod(...).Invoke(...)).
Здравствуйте, Аноним, Вы писали:
А>А> Type daoType = Type.GetType("AssemblyName.CommonDAO'1");
А>
Да, и надо писать обратный апостроф ` или, еще лучше typeof(CommonDAO<>).
Здравствуйте, nikov, Вы писали:
N>Да, и надо писать обратный апостроф ` или, еще лучше typeof(CommonDAO<>).
Простите — этого не понял. Код скописпастил из экзамплов. Из академического интереса прошу — поясните пожалуйста.
Здравствуйте, Аноним, Вы писали:
N>>Да, и надо писать обратный апостроф ` или, еще лучше typeof(CommonDAO<>).
А>Простите — этого не понял. Код скописпастил из экзамплов. Из академического интереса прошу — поясните пожалуйста.
Вместо GetType("CommonDAO'1") надо писать GetType("CommonDAO`1") или typeof(CommonDAO<>).
Здравствуйте, <Аноним>, Вы писали:
А>Приведение его хотябы к CommonDAO<object> возвращает null:
А>А>(myDAO as CommonDAO<object>) // это null
А>
Все правильно, генерики нужно точно кастовать...
Буквально вчера мы решили такю же задачу так: вытащили из нужных классов интерфейс и кастовали objSelectable не к ExtendedEntityCollection<???> а к ISelectable.
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>
Здравствуйте, Renny, Вы писали:
R>Здравствуйте, <Аноним>, Вы писали:
А>>Приведение его хотябы к CommonDAO<object> возвращает null:
А>>А>>(myDAO as CommonDAO<object>) // это null
А>>
R>Все правильно, генерики нужно точно кастовать...
R>Буквально вчера мы решили такю же задачу так: вытащили из нужных классов интерфейс и кастовали objSelectable не к ExtendedEntityCollection<???> а к ISelectable.
А можно подробнее