我正在尝试使用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内部引用的方法:
在使用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();
}