2012-02-25 3 views
2

Я подозреваю, что ответ отрицательный, но можно ли сделать что-то подобное в C# .NET (v2.0).Generic Casting

class Converter<E> 
{ 
    public E Make(object o) 
    { 
     return o as E; 
    } 
} 

Если нет, то можно проверить типы, как это:

public bool IsType(object o, Type t) 
{ 
    return o is E; 
} 

Я не уверен, о терминологии, поэтому довольно трудно Google для меня. Но я предполагаю, что эти две проблемы связаны между собой. Есть идеи?

ответ

5

Вы можете бросить o в E с помощью () Operator:

class Converter<E> 
{ 
    public E Make(object o) 
    { 
     return (E)o; 
    } 
} 

Если вы используете as, o as E требует E к быть ссылочного типа, потому что если o не кастуется на E, результат (E)null. Вы можете ограничить E ссылаться на типы, используя class Constraint:

class Converter<E> where E : class 
{ 
    public E Make(object o) 
    { 
     return o as E; 
    } 
} 

public bool IsType(object o, Type t) 
{ 
    return (o != null) ? t.IsAssignableFrom(o.GetType()) : t.IsClass; 
} 
+1

Это, вероятно, не имеет значения, но на 'как' также работает на обнуляемых типах значений. Так, например, 'o as int?' Компилируется. – svick

+0

Обратите внимание, что в первом примере, если E - тип значения, не равный nullable, то преобразование unboxing должно быть точным; то есть, если объект содержит вложенный в квадрат int, вы не можете распаковать его, чтобы удвоить, даже если вы можете преобразовать int в double. –