Как привести объект из Npgsqlreader к определенному типу свойства? - PullRequest
0 голосов
/ 24 января 2019

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

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

...