Ви повинні отримати базовий тип для цього ...
Спробуйте це, я успішно використовував це з дженериками:
//Coalesce to get actual property type...
Type t = property.PropertyType();
t = Nullable.GetUnderlyingType(t) ?? t;
//Coalesce to set the safe value using default(t) or the safe type.
safeValue = value == null ? default(t) : Convert.ChangeType(value, t);
Я використовую його в декількох місцях свого коду, один приклад - це допоміжний метод, який я використовую для перетворення значень баз даних в безпечний спосіб:
public static T GetValue<T>(this IDataReader dr, string fieldName)
{
object value = dr[fieldName];
Type t = typeof(T);
t = Nullable.GetUnderlyingType(t) ?? t;
return (value == null || DBNull.Value.Equals(value)) ?
default(T) : (T)Convert.ChangeType(value, t);
}
Викликається за допомогою:
string field1 = dr.GetValue<string>("field1");
int? field2 = dr.GetValue<int?>("field2");
DateTime field3 = dr.GetValue<DateTime>("field3");
Я написав серію публікацій у блозі, включаючи це на веб- сайті http://www.endswithsaurus.com/2010_07_01_archive.html (Прокрутіть до Доповнення, @JohnMacintyre насправді помітив помилку в моєму первісному коді, який привів мене до того ж шляху, який ви зараз). У мене є кілька невеликих модифікацій з цієї публікації, яка включає також перетворення типів enum, тому якщо ваша власність є Enum, ви все одно можете використовувати той самий метод виклику. Просто додайте рядок, щоб перевірити, чи є типи переліків, і ви їдете на гонки, використовуючи щось на кшталт:
if (t.IsEnum)
return (T)Enum.Parse(t, value);
Зазвичай у вас буде перевірка помилок або використання TryParse замість Parse, але ви отримаєте зображення.