IList.Cast <typeof(t)>()返回错误,语法看起来不错</typeof(t)>

时间:2008-09-04 03:08:52

标签: c# .net nhibernate .net-3.5 syntax

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 ....有人能看到一个明显的错误吗?

11 个答案:

答案 0 :(得分:7)

T不是类型,也不是System.TypeT是一个类型参数。 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()