public static IList<T> LoadObjectListAll<T>() { ISession session = CheckForExistingSession(); var cfg = new NHibernate.Cfg.Configuration().Configure(); var returnList = session.CreateCriteria(typeof(T)); var list = returnList.List(); var castList = list.Cast<typeof(T)>(); return castList; }
Итак, я получаю сообщение об ошибке сборки, когда я преобразую элемент "list" в общий IList ... Кто-нибудь может увидеть здесь явную ошибку?
T не является ни типом, ни System.Type. T является параметром типа. typeof(T) возвращает тип T. Оператор typeof не действует на объект, он возвращает объект Type типа. http://msdn.microsoft.com/en-us/library/58918ffs.aspx
T
System.Type
typeof(T)
typeof
Type
@ Джон правильно ответил на ваш прямой вопрос. Но код NHibernate там немного не в порядке. Вы не должны настраивать ISessionFactory после , например, получив ISession.
ISessionFactory
ISession
public static T[] LoadObjectListAll() { var session = GetNewSession(); var criteria = session.CreateCriteria(typeof(T)); var results = criteria.List<T>(); return results.ToArray(); }
Я думаю
var castList = list.Cast<typeof(T)>();
должно быть
var castList = list.Cast<T>();
@ Jon Limjap Самая явная ошибка, которую я вижу, это что IList определенно отличается от IList<T>. IList не является универсальным (например, ArrayList).
IList
IList<T>
ArrayList
В первоначальном вопросе уже использовался IList<T>. Он был удален, когда кто-то отредактировал форматирование. Вероятно, проблема с Markdown.
Исправлено.
У вас слишком много временных переменных, которые сбивают с толку
вместо
var returnList = session.CreateCriteria(typeof(T)); var list = returnList.List(); var castList = list.Cast<typeof(T)>(); return castList;
Просто сделай
return session.CreateCriteria(typeof(T)).List().Cast<T>();
@ Джонатан Холланд
T уже является параметром типа, вам не нужно вызывать typeof для него. TypeOf принимает тип и возвращает его параметр типа.
typeof «берет» тип и возвращает его System.Type
"Исходный вопрос уже использовал IList<T>. Он был удален, когда кто-то отредактировал форматирование. Возможно, проблема с Markdown."
Это то, что я видел, но оно было отредактировано кем-то, и именно поэтому я изложил свое объяснение ковариации, но по какой-то причине я был понижен до -1.
CLI поддерживает только универсальные аргументы для ковариации и контравариантности при использовании делегатов, но при использовании обобщений есть некоторые ограничения, например, вы можете привести строку к объекту, так что большинство людей будет предполагать, что вы можете сделать то же самое с List to Список, но вы не можете этого сделать, потому что нет никакой ковариации между общими параметрами, однако вы можете смоделировать ковариацию, как вы можете видеть в этой статье. Таким образом, это зависит от типа среды выполнения, который генерируется абстрактной фабрикой.
Это читается как цепочка Маркова ... Браво.
IList - это IList , он просто ошеломлен уценкой, когда она отправила его. Я пытался отформатировать его, но мне не хватало экранирования .. Исправляя это сейчас.
CLI поддерживает только обобщенные аргументы для ковариации и контравариантности при использовании делегатов, но при использовании обобщений есть некоторые ограничения, например, вы можете привести строку к объекту, так что большинство людей будет предполагать, что вы можете сделайте то же самое с List<string> до List<object>, но вы не можете этого сделать, потому что нет никакой ковариации между общими параметрами, однако вы можете смоделировать ковариацию, как вы можете видеть в этой статье . Таким образом, это зависит от типа среды выполнения, который генерируется абстрактной фабрикой.
List<string>
List<object>
Самая явная ошибка, которую я вижу, это то, что IList определенно отличается от IList<T>. IList не является универсальным (например, ArrayList).
Итак, подпись вашего метода должна быть:
public static IList<T> LoadObjectListAll()