У меня есть метод, который заполняет DataTable в простой объект DTO.Для упрощения я буду использовать этот пример:
public enum Gender : int
{
Male = 1,
Female = 2
}
public class Person
{
//...
public Gender? MyGender { get; set; }
}
static void Main(string[] args)
{
int intValue = 2; // value from DB
var o = new Person();
var prop = o.GetType().GetProperty("MyGender");
prop.SetValue(o, intValue , null); // <- Exception
}
Вышеуказанные значения:
Объект типа 'System.Int32' нельзя преобразовать в тип 'System.Nullable`1[Test.Program + Gender] '.
Если я объявляю MyGender
как Gender
(не Nullable), все работает нормально.
Это также работает, если я использую явное приведение prop.SetValue(o, (Gender)intValue, null);
НО, я не хочу ( и не могу ) использовать явное приведение: (Gender)intValue
потому что я не знаю базового «жесткого» типа при создании объекта DTO.
Я надеялся на что-то вроде (, доза которого не компилируется ):
var propType = prop.PropertyType;
prop.SetValue(o, (propType)intValue, null);
Я также пытался:
public static dynamic Cast(dynamic obj, Type castTo)
{
return Convert.ChangeType(obj, castTo);
}
var propType = prop.PropertyType;
prop.SetValue(o, Cast(intValue, propType), null);
Который бросает:
Неверное приведение из 'System.Int32' к 'System.Nullable`1 [[Test.Program + Gender ...]
Я нахожусь в тупике.какие у меня варианты?
.NET Framework 4.6.2