4
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 时遇到了构建错误……任何人都可以在这里看到明显的错误吗?

4

11 回答 11

7

T不是类型也不是System.Type. T是一个类型参数。 typeof(T)返回的类型Ttypeof运算符不作用于对象,它返回一个类型的对象Typehttp://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();        
}
于 2008-09-04T03:26:21.377 回答
5

我认为

var castList = list.Cast<typeof(T)>();

应该

var castList = list.Cast<T>();

@Jon Limjap 我能看到的最明显的错误是 anIList绝对不同于IList<T>. AnIList是非泛型的(例如,ArrayList)。

最初的问题已经在使用IList<T>. 当有人编辑格式时,它被删除了。可能是 Markdown 的问题。

现在修好了。

于 2008-09-04T03:14:58.783 回答
1

T 已经是一个类型参数,你不需要在它上面调用 typeof。TypeOf 接受一个类型并返回其类型参数。

于 2008-09-04T03:16:56.873 回答
1

IList 是一个 IList<T>,当她发布它时,它只是被 Markdown 吓到了。我试图格式化它,但我错过了转义 <T> ..现在修复它。

于 2008-09-04T03:23:18.107 回答
1

CLI 在使用委托时仅支持协变和逆变的泛型参数,但是在使用泛型时存在一些限制,例如,您可以将字符串强制转换为对象,因此大多数人会认为您可以对 List 执行相同操作,但是您不能这样做,因为泛型参数之间没有协方差,但是您可以模拟协方差,正如您在本文中看到的那样。所以它取决于抽象工厂生成的运行时类型。

这读起来像一个马尔可夫链......太棒了。

于 2008-09-04T03:32:07.260 回答
1

“最初的问题已经使用了IList<T>。当有人编辑格式时它被删除了。可能是 Markdown 的问题。”

这就是我所看到的,但它是由某人编辑的,这就是我解释协方差的原因,但由于某种原因,我被标记为 -1。

于 2008-09-04T03:40:42.980 回答
1

@乔纳森荷兰

T 已经是一个类型参数,你不需要在它上面调用 typeof。TypeOf 接受一个类型并返回其类型参数。

typeof“接受”一个类型并返回它的System.Type

于 2008-09-04T03:49:27.280 回答
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>();
于 2008-09-04T04:56:41.800 回答
0

@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>();
}
于 2008-09-04T03:18:33.547 回答
0

CLI 在使用委托时仅支持协变和逆变的泛型参数,但在使用泛型时存在一些限制,例如,您可以将字符串强制转换为对象,因此大多数人会认为您可以List<string>对 a执行相同操作,List<object>但您可以不要那样做,因为泛型参数之间没有协方差,但是您可以模拟协方差,正如您在本文中看到的那样。所以它取决于抽象工厂生成的运行时类型。

于 2008-09-04T03:31:19.553 回答
-1

我能看到的最明显的错误是 anIList绝对不同于IList<T>. AnIList是非泛型的(例如,ArrayList)。

所以你的方法签名应该是:

public static IList<T> LoadObjectListAll()
于 2008-09-04T03:18:38.057 回答