我正在尝试编写一种通用方法,用于将接收自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是一个变量,但像类型一样使用。
这是否有可能做我想做的事情?还是有其他铸造方法?