我正在开发一个使用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()
方法,所以我绝对不明白这里发生了什么。
有人可以阐明这个问题吗?我越来越绝望了。
答案 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处理自己应该能够处理的情况。