Joh*_*ski 18 c# reflection asp.net-membership dapper
我正在尝试使用Dapper与ASP.NET SQL Membership Provider表进行交互.我包装了SqlMembershipProvider类并添加了一个额外的方法来获取MembershipUsers给出一些与我的一些自定义表相关的标准.
使用Dapper查询数据时,似乎Dapper首先使用无参数构造函数实例化该类,然后将返回的列"映射"到对象的属性中.
但是,MembershipUser类上的UserName属性没有setter.从Dapper SqlMapper.cs中的第1417行开始,该方法GetSettableProps()只获得可设置的属性.
我试图做一个MultiMap查询来调用构造函数,但问题是传递给查询的对象已经缺少UserName.
我猜我可以修改GetSettableProps()方法,但我不确定这是否有效,或者它是否会影响我现有的代码.
反正我是否要调用MembershipUser类具有的自定义构造函数?
或者我是否可以对Dapper做出合理的改变以支持我的情况?
**更新**
Marc使用非泛型/动态Query()方法的答案是正确的,但对后人来说,这是我在Dapper中引用的方法:
static List<PropInfo> GetSettableProps(Type t)
{
return t
.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Select(p => new PropInfo
{
Name = p.Name,
Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true),
Type = p.PropertyType
})
.Where(info => info.Setter != null)
.ToList();
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 32
我会在这里使用非通用的查询API ...
return connection.Query(sql, args).Select(row =>
new AnyType((string)row.Foo, (int)row.Bar) {
Other = (float)row.Other }).ToList();
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以使用"动态"作为中间步骤,同时使用非默认构造函数和属性赋值,而无需任何更改.