#c# #.net #nhibernate #lambda #compiler-errors
#c# #.net #nhibernate #лямбда #ошибки компилятора
Вопрос:
Недавно я начал играть с nhibernate и в настоящее время пытаюсь реализовать универсальную функцию, которая выполняет поиск в базе данных записей с определенным именем:
public T FindName<T>(string name) where T : class
{
T obj;
using (ISession session = m_SessionFactory.OpenSession())
{
obj = session.QueryOver<T>()
.Where(x => x.Name == name).SingleOrDefault();
}
return obj;
}
Проблема в том, что я получаю жалобу на «.Где(x => x.Name == имя)» оператор: «Делегировать»систему.Функция ‘не принимает 1 аргумент». Из того, что я видел в Интернете, это утверждение используется довольно часто, и я не уверен, что я делаю неправильно.
Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи.
Большое спасибо.
Ответ №1:
Вам нужно убедиться, что вы можете вызывать Name для x типа T.
Этого можно достичь, создав интерфейс с именем свойства, типом string и указав…
где T : класс, не изменяемый
Вот некоторый код:
interface INameable
{
string Name { get; }
}
class MyClass
{
ISessionFactory m_SessionFactory;
public T FindName<T>(string name) where T : class, INameable
{
T obj;
using (ISession session = m_SessionFactory.OpenSession())
{
obj = session.QueryOver<T>()
.Where(x => x.Name == name).SingleOrDefault();
}
return obj;
}
Комментарии:
1. @Morris: Я чувствую, что это случай плохого сообщения об ошибке компилятора. Это должно дать лучшее руководство в таком простом случае. Тот факт, что это универсальный вариант универсального, все же немного усложняет работу компилятора.