2009-04-29 2 views
3

Я использую отражение для получения значений из анонимного типа:C# Отраженный Тип недвижимости

object value = property.GetValue(item, null); 

, когда базовое значение является обнуляемым типа (? T), как я могу получить базовый тип, когда значение равно null?

Учитывая

int? i = null; 

type = FunctionX(i); 
type == typeof(int); // true 

В поисках функции х(). Надеюсь, это имеет смысл. Благодарю.

ответ

6

Вы можете сделать что-то вроде этого:

if(type.IsgenericType) 
{ 
    Type genericType = type.GetGenericArguments()[0]; 
} 

EDIT: Для общего применения:

public Type GetTypeOrUnderlyingType(object o) 
{ 
    Type type = o.GetType(); 
    if(!type.IsGenericType){return type;} 
    return type.GetGenericArguments()[0]; 
} 

использование:

int? i = null; 

type = GetTypeOrUnderlyingType(i); 
type == typeof(int); //true 

Это будет работать для любого универсального типа, не просто Nullable.

+0

Есть ли способ сделать это очень общей целью? Как насчет строки, которая является нулевой? Могу ли я вернуть строку? – andleer

+0

Нет. Это не будет работать для обычных типов ссылок. Если у вас ничего нет, вы не можете сказать, что это может быть. Это будет похоже на то, что я даю вам пустую коробку, а затем спрашиваю, какой цвет книга. Он работает для типов с нулевым значением, потому что они немного нечетны и имеют экземпляр объекта для представления null. – pipTheGeek

+0

Что происходит, когда я передаю какой-то другой общий тип? например, Список , Действие и т. д. – LukeH

2

Если вы знаете, что есть Nullable<T>, вы можете использовать статический помощник GetUnderlyingType(Type) в Nullable.

int? i = null; 

type = Nullable.GetUnderlyingType(i.GetType()); 
type == typeof(int); // true 
Смежные вопросы