Распаковка неизвестной структуры
От: nikov США http://www.linkedin.com/in/nikov
Дата: 31.07.06 14:59
Оценка:
public struct A
{
    internal A(object obj)
    {
        /* ... */
    }
    /* ... */
}

public struct B<T>
{
    public static explicit operator A(B<T> b) // любую реализацию генерика B<T> можно привести к A
    {
        return new A(b);
    }
    /* ... */
}


public class Test
{
    public static void Main()
    {
        B<int> b = new B<int>();
        object boxed = b;
        
        A a = unbox(boxed);
    }

    private static A unbox(object boxed)
    {
        // return (A) boxed; - InvalidCastException
        return (A) (B<int>) boxed; // распаковка и явное приведение типа
    }
}


В методе unbox я был вынужден написать два оператора приведения, чтобы сначала произошла распаковка, а потом явное приведение типа. Но в реальной ситуации в параметре boxed может лежать не B<int>, а B<double> или вообще любой B<T>. Как мне переписать строку

        return (A) (B<int>) boxed; // распаковка и явное приведение типа


чтобы я мог распаковать любой из этих объектов?
Re: Распаковка неизвестной структуры
От: cvetkov  
Дата: 31.07.06 16:20
Оценка:
Здравствуйте, nikov, Вы писали:

N>В методе unbox я был вынужден написать два оператора приведения, чтобы сначала произошла распаковка, а потом явное приведение типа. Но в реальной ситуации в параметре boxed может лежать не B<int>, а B<double> или вообще любой B<T>. Как мне переписать строку


N>
N>        return (A) (B<int>) boxed; // распаковка и явное приведение типа
N>


N>чтобы я мог распаковать любой из этих объектов?


Никак. это не возможно (без шаманства и рефлекшена)
потомучто оператор кастинга (в данном случае кастомный) определяеться в компайл тайме, а значит компилятор должен знать типы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Распаковка неизвестной структуры
От: Константин Л. Россия  
Дата: 31.07.06 17:09
Оценка: 1 (1)
Здравствуйте, nikov, Вы писали:

[]

N>
N>public class Test
N>{
N>    public static void Main()
N>    {
N>        B<int> b = new B<int>();
N>        object boxed = b;
        
N>        A a = unbox(boxed);
N>    }

N>    private static A unbox(object boxed)
N>    {
N>        // return (A) boxed; - InvalidCastException
N>        return (A) (B<int>) boxed; // распаковка и явное приведение типа
N>    }
N>}
N>


Ну если ты точно знаешь, что у тебя в unbox передается B<T>, то сделай unbox generic методом
Estuve en Granada y me acorde' de ti
Re[2]: Распаковка неизвестной структуры
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.08.06 06:21
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>Никак. это не возможно (без шаманства и рефлекшена)

C>потомучто оператор кастинга (в данном случае кастомный) определяеться в компайл тайме, а значит компилятор должен знать типы.

Шаманства не нужно. А вот рифлекшн вполне подойдет.
Re[2]: Распаковка неизвестной структуры
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.08.06 06:30
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Ну если ты точно знаешь, что у тебя в unbox передается B<T>, то сделай unbox generic методом


Имеется в виду такой вариант, да?

    private static A unbox<T>(object boxed)
    {
        return (A) (B<T>) boxed;
    }


В данной ситуации это подойдет, но на самом деле все гораздо хуже.

public struct A
{
    public static explicit operator A(bool b) { /* ... */ }
    public static explicit operator A(int b) { /* ... */ }
    /* ... */
}

public struct B<T>
{
    public static explicit operator A(B<T> b) { /* ... */ }
    /* ... */
}

public struct C<T>
{
    public static explicit operator A(C<T> b) { /* ... */ }
    /* ... */
}

/* public struct D<T> */
/* public struct E<T> */
/* ... */
Re[3]: Распаковка неизвестной структуры
От: TK Лес кывт.рф
Дата: 01.08.06 06:37
Оценка:
Hello, "nikov"
>
> Шаманства не нужно. А вот рифлекшн вполне подойдет.

А какие тогда проблемы? Оператор приведения типа это метод. В чем сложность
вызвать его через reflection?
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Распаковка неизвестной структуры
От: Константин Л. Россия  
Дата: 01.08.06 08:49
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Константин Л., Вы писали:


КЛ>>Ну если ты точно знаешь, что у тебя в unbox передается B<T>, то сделай unbox generic методом


N>Имеется в виду такой вариант, да?


да.

А так? Правда я плохо знаком с generics

N>
N>    private static A unbox<T,U>(object boxed)
N>    {
N>        return (A) (U<T>) boxed;
N>    }
N>


[]
Estuve en Granada y me acorde' de ti
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.