NHibernate:无法从IronPython

时间:2018-12-11 23:16:14

标签: nhibernate ironpython

我正在开发一个使用NHibernate和IronPython的项目。

因此从IronPython,我可以查询class Foo的单个实例。当我想要C#中class Foo的所有实例的列表时,我会这样做

session.QueryOver<Foo>().List()

但是当我尝试将其翻译为python时,

session.QueryOver[Foo]().List()

我总是有例外

System.MissingMemberException: 'QueryOver[Foo, Foo]' object has no attribute 'List'

起初,我认为QueryOver的默认参数是一个问题,但是ISession实际上有QueryOver的4个重载-它们都没有默认参数(我仍然有尝试像以前Can I use Named and Optional Arguments in ironpython中那样传递Missing.Value,但这无济于事

然后我以为List()可能是一种扩展方法,但是我像https://www.grasshopper3d.com/forum/topics/accessing-my-extension-methods-from-python-component一样尝试了clr.ImportExtensions,却什么也没做。

QueryOver[Foo,Foo]源自QueryOver[Foo]。现在来看https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Criterion/QueryOver.cs#L223,我发现QueryOver<Foo>确实有一种方法List(),但它的定义方式很怪异。

我认为该方法只是从实现的接口中明确说明了哪个List()方法,所以我绝对不明白这里发生了什么。

有人可以阐明这个问题吗?我越来越绝望了。

1 个答案:

答案 0 :(得分:0)

我知道了:

https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Criterion/QueryOver.cs#L223中的“怪异”定义是显式实现的接口方法。根据{{​​3}},这些方法实际上并没有成为对象的成员(恕我直言,这是非常违反直觉的-您有一个实现接口的对象,但是没有该接口的方法!?)。这就是IronPython无法找到方法的原因-C#显然以不同的方式解决了调用。

无论如何-根据https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation,您需要在python中以不同的方式调用此类方法。您需要像这样明确地选择要使用的接口:

IQueryOver[Foo].List(session.QueryOver[Foo]())

老实说,我不明白为什么这个问题被否决了。恕我直言,这是一个相对合理的用例(考虑到NHibernate和IronPython都是流行的库),恕我直言,令人惊讶的是它不能像我最初尝试的那样起作用。 在提出问题之前,我尝试了几种方法来解决问题-最终要解决该问题,我不得不遍历NHibernate的源代码,GUESS该定义的作用(因为它很奇特,并且没有得到很好的文档记录恕我直言),然后找到了解决方法python处理自己应该能够处理的情况。