Имя: Пароль:
IT
 
.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) Добавлю