В этом случае v
имеет тип object
.Если value
равно нулю, то v
будет равно нулю;если value
- какое-то целое число, то v
будет этим целым числом.Если вы хотите, чтобы v
действительно имел тип Nullable<int>
, вы должны объявить его следующим образом: var v = (int?) fld.GetValue(obj);
.
Если вам нужно иметь возможность ссылаться на v.Value
и получить обратно упакованное значениеВам, вероятно, придется записать тот факт, что fld
был обнуляем (Nullable.GetUnderlyingType(fld.FieldType) != null
).Обратите внимание, что генерики здесь вам не помогут, потому что вы не знаете T
во время компиляции.
Вот помощник, который вы можете использовать:
struct NullableObject
{
public object Value { get; private set; }
public static object GetField(object Target, FieldInfo Field)
{
object value = Field.GetValue(Target);
if (Nullable.GetUnderlyingType(Field.FieldType) != null)
return new NullableObject { Value = value };
return value;
}
}
public static class NullableHelper
{
public static object GetNullableValue(this FieldInfo field, object target)
{
return NullableObject.GetField(target, field);
}
}
Тогда вместо вызова var v = fld.GetValue(obj);
скажем var v = fld.GetNullableValue(obj);
.Если fld
представляет тип Nullable, вы получите объект со свойством Value
;если нет, вы просто получите значение.