|
.NET динамическое приведение типа | ☑ | ||
---|---|---|---|---|
0
oleg_km
25.09.13
✎
17:42
|
нужно динамически привести тип, т.е. чтобы можно было дать исходный объект и переменную, содержащую нужный тип, а на выходе был объет указанного типа, ну или исключение если нельзя. Просто функция возвращает какой объект, отнаследованный от интерфейса, но без приведения к типу интерфейса свойства не видно
|
|||
2
oleg_km
25.09.13
✎
17:45
|
забыл написать, клас Convert пробовал: работатет только на базовых типах, или которые реализовали онтерфейс IConvert... Класс System.ComponentModel.TypeConverter просто говорит не могу. нужно динамический аналог oRes = oSrc as oType
|
|||
3
Serginio1
25.09.13
✎
18:10
|
Типа утинной типизации?
http://www.rsdn.ru/forum/src/3165397.1 |
|||
4
Serginio1
25.09.13
✎
18:12
|
В Net всегда возвращается ссылка на объект, а при вызове метода интерфейса ищутся методы в таблице интерфейсов по аналогии с VMT
|
|||
5
Serginio1
25.09.13
✎
18:16
|
||||
6
oleg_km
25.09.13
✎
20:30
|
Ну в моем-то случае тип исходного объекта является наследником интерфейса и в C# работает простое приведение. Просто есть ли на шарпе конструкция приведения, которая тип возьмет из переменной типа Type?
|
|||
7
Torquader
26.09.13
✎
00:42
|
Какое-такое приведение типа - если есть объект, то у него всегда тип задан - изменить тип объекта нельзя, так как это просто его разрушит.
Изменить тип интерфейса, конечно, можно, но если интерфейсы наследуемые, то это просто ничего не даст - таблицу функций даже если и будут рассматривать, как урезанную, но реально от неё никто и ничего не урежет. Потом, приведение типов нужно когда функция вызывается по адресу, а не по имени - тогда можно получить эффект, а если вызывается по имени, то для вызывающего - все объекты одинаковы. |
|||
8
Serginio1
26.09.13
✎
13:00
|
То есть тебе нужно в переменную неизвестного типа установить ссылку без приведения?
StructLayout(LayoutKind.Explicit)] public struct ПриведениеТипа { [FieldOffset(0)] public Object ValueObject; [FieldOffset(0)] public НужныйТип ПеременнаяНужногоТипа; } ПриведениеТипа проба= новый(Объект); Проба.ПеременнаяНужногоТипа.Метод(); |
|||
9
oleg_km
26.09.13
✎
14:44
|
(8) Нет, я пользуюсь твоим классом AutoWrap. На вызов некоегого метода возвращается System.Data.Common.DbAsyncResult. Это какой-то внутренний класс, потомок System.IAsyncResult и я в отладчике вижу, что у класса System.Data.Common.DbAsyncResult нет открытых членов, но если в отладчике C# сделать приведение (System.IAsyncResult) Result, то сразу появляются события интерфейса System.IAsyncResult. Вот и вопрос, как сделать приведение переменной одного типа к другой, используюя не явно указанный новый тип, а посредством переменной типа Type
|
|||
10
Serginio1
26.09.13
✎
15:54
|
А тебе нужно в AutoWrap сделать метод который вернет собственно объект
public object ПолучитьОбъект(object Obj) { return new AutoWrap(obj); } |
|||
11
Serginio1
26.09.13
✎
15:57
|
Либо
public object ПолучитьОбъект(object Obj,Type тип) { return new AutoWrap(obj,тип); } где public AutoWrap(object obj, Type type) { O = obj; T = type; ЭтоТип = false; } |
|||
12
oleg_km
26.09.13
✎
17:00
|
(12) Оригинально, попробую. Так сказать "утиная" типизация в чистом виде
|
|||
13
oleg_km
26.09.13
✎
17:32
|
(12) Спасибо, получилось
|
|||
14
Serginio1
26.09.13
✎
18:05
|
Можешь сделать проверку
Obj.GetType().IsAssignableFrom(тип) |
|||
15
oleg_km
26.09.13
✎
22:02
|
(14) Добавлю
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |