2013-07-03 5 views
1

Im пытается создать метод расширения в среде, где используется много отражений.Nullable, check for default

Цель метода - воссоздать, что делает default() во время выполнения.

Он отлично работает для всех, кроме тех, что недействительны. <> типы. Даже? -Типы работают правильно.

Я понятия не имею, как я могу узнать, если значение, присвоенное переменной объекта является Nullable <> а не «правильный тип valute»

Nullable.GetUnderlyingType-метод возвращает нуль в этом случае , но работает над? -Типами.

Мы знаем, что значение по умолчанию (Nullable) == null. Мой метод расширения дает неверные результаты, когда Nullable получает 0, так как 0 == default (int).

Надеюсь, вы получите то, что Iam пытается объяснить здесь, одним словом: - Как определить, является ли «случайный» объект Nullable, а не int?

Метод выглядит следующим образом (удалено любое кэширование для простоты) я взял деталь здесь How to check if an object is nullable?

public static bool IsDefault(this object obj) 
{ 
    if(obj == null) 
     return true; 
    else 
    { 
     Type objType = obj.GetType(); // This gives int32 for Nullabe<int> !?! 

     if(Nullable.GetUnderlyingType(objType) != null) 
      return false; 
     else if(objType.IsValueType) 
      return Object.Equals(obj, Activator.CreateInstance(objType); 
     else 
      return false; 
    } 
} 

Чтобы сделать это более ясно, что я не могу использовать общие вещи ...

ответ

3

Вы можете Не делайте этого, потому что, когда вы вызываете метод, nullable struct вставляется в ячейку object и становится либо null, либо значением Int32. Это объясняется в более раннем ответе: Why GetType returns System.Int32 instead of Nullable<Int32>?

Если ваша переменная печатается как объект в том месте, где вызывается этот метод, я не думаю, что вы можете получить необходимую информацию - она ​​уже помещена в бокс.

+0

Я боялся этого, ну спасибо. – CSharpie

2

Когда обнуляемым типа упаковывается к object, тот факт, что он был обнуляемым теряется: он либо становится набившие оскомину int или набившие оскомину null. Если ваш объект уже сохранен как тип object, вы не сможете его восстановить.

+0

@driis был быстрее, по-прежнему благодарю вас – CSharpie

+0

@CSharpie Я бы рекомендовал выбрать на основе того, какой ответ лучше - в этом случае я бы согласился, что это driis's - не основанный на небольшой разнице во времени. –

+0

Thats true, я прочитал их оба. – CSharpie

-1

От http://msdn.microsoft.com/en-us/library/ms366789.aspx:

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…} 
+0

objType is int, int не является общим ... – CSharpie

+0

На самом деле мой код не работает, потому что параметр помещает его в объект. Не то, что ты сказал. –

0

Кажется, вы можете выяснить, является ли тип обнуляемым делать что-то вроде этого:

public static bool IsDefault<T>(this T obj) 
{ 
    var t = typeof(T); 
    var isNullable = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>); 
    // ... 
} 

Ваш метод должен быть общим для этой работы, хотя.

+0

Еще раз, никаких дженериков. Также не уверен, что троллинг – CSharpie

+1

А, пропустил это. И hehe нет, stackoverflow нашел мой gravatar сам по себе, и я был слишком ленив, чтобы изменить его. – Chris