IList.Cast<typeof(T)>() 返回错误,语法看起来没问题
-
09-06-2019 - |
题
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
@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();
}
其他提示
我认为
var castList = list.Cast<typeof(T)>();
应该
var castList = list.Cast<T>();
@Jon limjap我可以看到的最明显的错误是
IList
绝对不同于IList<T>
. 。一个IList
是非传播的(例如ArrayList
).
最初的问题已经使用了 IList<T>
. 。当有人编辑格式时,它被删除了。可能是 Markdown 的问题。
现在修好了。
IList 是一个 IList<T>,当她发布它时,它刚刚被 markdown 弄乱了。我尝试格式化它,但我错过了转义 <T>..现在修复它。
CLI 在使用委托时仅支持协变和逆变的泛型参数,但是在使用泛型时存在一些限制,例如,您可以将字符串转换为对象,因此大多数人会认为您可以对 List 执行相同的操作,但您不能这样做,因为通用参数之间不存在协方差,但是您可以模拟协方差,如本文中所示。所以它取决于抽象工厂生成的运行时类型。
读起来就像马尔可夫链......太棒了。
T 已经是一个类型参数,您不需要对其调用 typeof 。TypeOf 接受一个类型并返回其类型参数。
“最初的问题已经使用了 IList<T>
. 。当有人编辑格式时,它被删除了。可能是 Markdown 的问题。”
这就是我所看到的,但它是由某人编辑的,这就是为什么我提出关于协方差的解释,但由于某种原因我被标记为-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>();
@乔纳森·霍兰德
T 已经是一个类型参数,您不需要对其调用 typeof 。TypeOf 接受一个类型并返回其类型参数。
typeof
“获取”一个类型并返回它的 System.Type
@Jon 和 @Jonathan 是正确的,但您还必须将返回类型更改为
IList<T>
还。除非那只是一个降价错误。
@乔纳森, ,认为是这样的。
我不确定您使用的是哪个版本的 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>();
}
我能看到的最明显的错误是 IList
绝对不同于 IList<T>
. 。一个 IList
是非通用的(例如, ArrayList
).
所以你的方法签名应该是:
public static IList<T> LoadObjectListAll()