Я пытаюсь использовать Dapper для взаимодействия с таблицами поставщика ASP.NET SQL Memberhip. Я завернул класс SqlMembershipProvider и добавил дополнительный метод, чтобы получить мне MembershipUsers с учетом определенных критериев, относящихся к некоторым пользовательским таблицам, которые у меня есть.
При запросе данных с помощью Dapper кажется, что Dapper сначала создает экземпляр класса с конструктором без параметров, а затем "отображает" возвращенные столбцы в свойства объекта.
Однако свойство UserName в классе MembershipUser не имеет сеттера. Судя по строке 1417 в Dapper SqlMapper.cs, метод GetSettableProps()
получает только настраиваемые свойства.
Я попытался сделать запрос MultiMap, чтобы вызвать конструктор, но проблема с этим - объекты, переданные в запрос, уже пропускают имя пользователя.
Я предполагаю, что могу изменить метод GetSettableProps()
, но я не уверен, что это сработает или это повлияет на мой существующий код.
Есть ли в любом случае для вызова пользовательского конструктора класса MemberhipUser?
Или есть разумные изменения, которые я мог бы сделать для Dapper для поддержки моей ситуации?
** ОБНОВЛЕНИЕ **
Ответ Marc на использование метода non-generic/dynamic 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();
}