Как привести объект из Npgsqlreader к определенному типу свойства?

Я пытаюсь написать универсальный метод для приведения полученных данных из 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 является переменной, но используется как тип.

Можно ли вообще делать то, что я хочу? Или есть другие способы кастинга?

0 ответов

Другие вопросы по тегам