Я пытаюсь написать универсальный метод для приведения полученных данных из Npgsqlreader к конкретному объекту C # (.NET Core 2.1).
Для повышения производительности при отражении я решил использовать пакет FastMember.
Вот код:
using System;
using System.Linq;
using FastMember;
using Npgsql;
namespace API.Helpers {
public static class Mapper {
public static T MapToObject<T>(this NpgsqlDataReader reader) where T : class, new() {
var accessor = TypeAccessor.Create(typeof(T));
var members = accessor.GetMembers();
var t = new T();
for (int i = 0; i < reader.FieldCount; i++) {
if (!reader.IsDBNull(i)) {
string fieldName = reader.GetName(i);
if (members.Any(m => string.Equals(m.Name, fieldName, StringComparison.OrdinalIgnoreCase))) {
accessor[t, fieldName] = reader.GetValue(i);
}
}
}
return t;
}
}
}
Например, у меня есть эта модель для кастинга:
public class ThreadModel {
public long? id { get; set; }
public string author { get; set; }
public System.DateTime? created { get; set; }
public string forum { get; set; }
public string message { get; set; }
public string slug { get; set; }
public string title { get; set; }
public long votes { get; set; }
}
Но в некоторых случаях метод дает мне исключение, подобное: Невозможно привести объект типа 'System.Int32' к типу 'System.Int64' , что меня смутило.
Итак, я решил привести значение к типу определенного свойства, например:
foreach (var m in members) {
if (string.Equals(m.Name, fieldName, StringComparison.OrdinalIgnoreCase)) {
var fieldType = m.Type;
accessor[t, fieldName] = reader.GetValue(i) as fieldType;
}
}
Но я не могу это сделать: fieldType - это переменная, но она используется как тип .
Возможно ли вообще делать то, что я хочу? Или есть другие способы кастинга?