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 ....有人能看到一个明显的错误吗?
答案 0 :(得分:7)
T
不是类型,也不是System.Type
。 T
是一个类型参数。 typeof(T)
会返回T
的类型。 typeof
运算符不对某个对象起作用,它返回一个类型的Type
对象。 http://msdn.microsoft.com/en-us/library/58918ffs.aspx
@John回答你的直接问题是正确的。但是NHibernate的代码有点偏差。例如,在获取ISessionFactory
之后,您不应该配置ISession
。
public static T[] LoadObjectListAll()
{
var session = GetNewSession();
var criteria = session.CreateCriteria(typeof(T));
var results = criteria.List<T>();
return results.ToArray();
}
答案 1 :(得分:5)
我认为
var castList = list.Cast<typeof(T)>();
应该是
var castList = list.Cast<T>();
@Jon Limjap我能看到的最明显的错误是
IList
肯定与IList<T>
不同。IList
是非通用的 (例如,ArrayList
)。
原始问题已使用IList<T>
。有人编辑格式时删除了它。可能是Markdown的一个问题。
现在修复。
答案 2 :(得分:1)
T已经是一个类型参数,您不需要在其上调用typeof。 TypeOf接受一个类型并返回其类型参数。
答案 3 :(得分:1)
IList是一个IList&lt; T&gt;,当她发布它时,它刚刚被降价感染了。我尝试格式化它,但我错过了转发&lt; T&gt; ..现在修复它。
答案 4 :(得分:1)
CLI在使用委托时仅支持协方差和逆变的通用参数,但在使用泛型时存在一些限制,例如,您可以将字符串强制转换为对象,因此大多数人会假设您可以对List执行相同操作一个列表,但你不能这样做,因为通用参数之间没有协方差,但是你可以模拟协方差,正如你在本文中看到的那样。所以它取决于抽象工厂生成的运行时类型。
这就像马尔可夫链...... Bravo。
答案 5 :(得分:1)
“原始问题已经在使用IList<T>
。当有人编辑格式时,它已被删除。可能是Markdown的问题。”
这就是我所看到的,但它是由某人编辑的,这就是为什么我对协方差进行了解释,但出于某种原因我被标记为-1。
答案 6 :(得分:1)
@Jonathan Holland
T已经是一个类型参数,您不需要在其上调用typeof。 TypeOf接受一个类型并返回其类型参数。
typeof
“接受”一个类型并返回其System.Type
答案 7 :(得分:1)
你有太多令人困惑的临时变量
而不是
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>();
答案 8 :(得分:0)
@Jon和@Jonathan是正确的,但您还必须将返回类型更改为
IList<T>
也。除非那只是一个降价错误。
@ Jonathan,确实是这种情况。
我不确定您使用的是什么版本的nHibernate。我还没有尝试过2.0的黄金版本,但你可以通过删除一些行来清理一些方法:
public static IList<T> LoadObjectListAll()
{
ISession session = CheckForExistingSession();
// Not sure if you can configure a session after retrieving it. CheckForExistingSession should have this logic.
// var cfg = new NHibernate.Cfg.Configuration().Configure();
var criteria = session.CreateCriteria(typeof(T));
return criteria.List<T>();
}
答案 9 :(得分:0)
CLI在使用委托时仅支持covariance and contravariance的通用参数,但在使用泛型时存在一些限制,例如,您可以将字符串强制转换为对象,因此大多数人会认为您可以使用List<string>
到List<object>
,但您不能这样做,因为通用参数之间没有协方差,但您可以模拟协方差,如您在此article中所见。所以它取决于抽象工厂生成的运行时类型。
答案 10 :(得分:-1)
我能看到的最明显的错误是IList
肯定与IList<T>
不同。 IList
是非通用的(例如ArrayList
)。
所以你的方法签名应该是:
public static IList<T> LoadObjectListAll()