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

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

@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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top