Я пытаюсь сделать общий метод, который будет принимать порядок по параметру, который я мог бы затем проверить для его имени и атрибутов, прежде чем строить запрос и отправлять его в базу данных.Общий порядок по параметру
Я думал что-то вроде:
public class SearchEngine<T>
{
// Removed other parameters to make it simple
public IEnumerable<T> Search<K>(Func<T, K> orderBy)
{
throw new NotImplementedException();
}
}
Я надеялся потреблять его позже:
var searchEngine = new SearchEngine<User>();
var result = searchEngine.Search(x => x.Name);
Моя цель состоит в том, чтобы ухватить, внутри метода поиска, в этом чтобы я мог получить имя свойства, «Имя» в этом случае и даже после него, использовать отражение, чтобы получить его атрибуты для получения другой информации, которую я установил.
Я знаю о получении атрибутов, что я не уверен, как я могу получить информацию о передаваемом объекте. Я уверен, что Linq делает это в некотором роде, я просто не знаю, как это сделать.
Если бы я попытался что-то вроде:
var result = searchEngine.Search<PropertyInfo>(x => x.Name);
Это не работал бы, так как параметр возвращает строку, в данном случае.
Любые идеи будут оценены.
Marcin, только что проверил это на Linqpad, и он работает точно так, как я хотел. Я понимаю ваш комментарий относительно причины возникновения аргумента, поэтому вы делаете нулевую проверку после AS. Есть ли способ ограничить их только свойствами, возможно, с помощью ограничения? –
@ Революции, которые вы имеете в виду, скомпилировать ограничение времени? Или время выполнения? Во время компиляции это невозможно, чтобы проверить на runtime справку 'if' выражение:' if (memberExpression == null || memberExpression.Member.MemberType! = System.Reflection.MemberTypes.Property) '. – MarcinJuraszek
время компиляции, например, где K: «что-то» –