如何将对象从Npgsqlreader强制转换为特定的属性类型?

时间:2019-01-23 21:23:06

标签: c# reflection casting npgsql fastmember

我正在尝试编写一种通用方法,用于将接收自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 个答案:

没有答案