Исходя из другого вопроса по Переполнение стека другим пользователем, я подумал, что попробую код и посмотрю, смогу ли я его улучшить.
Я хотел бы получить разъяснения по ряду вещей:
- Я предполагаю, что получение информации о недвижимости с помощью размышлений является дорогостоящим? Правильно?
- С
PropertyInfo.SetValue(Object, Object, Object[])
для чего нужен последний параметр? Я в безопасности, переходя в ноль?
- Есть ли другие улучшения, которые очевидны в моем коде?
Весь смысл в обучающем упражнении, чтобы посмотреть, смогу ли я создать что-то вроде Dapper (что очень приятно) , но без отвратительного вида (потому что я понятия не имею) IL выбрасывать вещи. Имея это в виду, я попытался реализовать какое-то кэширование, предполагая, что отражение плохо влияет на производительность.
Код
private T CreateItemFromRow<T>(SqlDataReader row, List<PropertyInfo> properties, Dictionary<String, Int32> schema) where T : new()
{
T item = new T();
if (schema != null && properties != null && row != null)
{
foreach (var property in properties)
{
if (schema.ContainsKey(property.Name))
{
// is this ok?
if (row[0].GetType() == property.PropertyType)
{
property.SetValue(item, row[schema[property.Name]], null);
}
else
{
property.SetValue(item, Convert.ChangeType(row[schema[property.Name]], property.PropertyType), null);
}
}
}
}
return item;
}
Свойства передаются из этого метода:
private List<PropertyInfo> GetPropertyInformation<T>()
{
List<PropertyInfo> properties;
Type _T = typeof(T);
if (!PropertyCache.ContainsKey(_T))
{
properties = _T.GetProperties().ToList();
PropertyCache.Add(_T, properties);
}
else
{
properties = PropertyCache[_T];
}
return properties;
}
А это декларация PropertyCache
private static Dictionary<Type, List<PropertyInfo>> PropertyCache { get; set; }