RavenDB提供了两个用于查询数据的API,IDocumentQuery<T>
用于高级lucene查询,IRavenQueryable<T>
用于强类型linq提供程序模型。
它们共享一个名为Statistics(out RavenQueryStatistics stats)
的方法,该方法在运行时返回信息。
两种不同的方法签名是:
public interface IRavenQueryable<T> ....
{
IRavenQueryable<T> Statistics(out RavenQueryStatistics stats);
和
public interface IDocumentQueryBase<T, out TSelf>
where TSelf : IDocumentQueryBase<T, TSelf>
{
TSelf Statistics(out RavenQueryStatistics stats);
我从开始
protected override dynamic SetupQuery(IDocumentSession session)
{
return session.Advanced.LuceneQuery<Foo>(new FooIndex().IndexName)
.WhereEquals("Bar", "Baz")
;
}
目的是这个方法能够被其他类所取代。
我正试图这样消费:
using (var session = Store.OpenSession())
{
RavenQueryStatistics stats=null;
var dynQuery= SetupQuery(session);
var dynQuery2 = dynQuery.Statistics(out stats);
//Results in cannot cast void to object
//next i tried using reflection
var refQuery= SetupQuery(session);
MethodInfo methodInfo = refQuery.GetType()
.GetMethod("Statistics", BindingFlags.Public, null,
new[] {typeof (RavenQueryStatistics).MakeByRefType()}, null);
var refQuery2= methodInfo.Invoke(query, new[] {stats});
//results in NullReferenceException
您正在查看接口定义,但事实证明,动态调用最终会调用AbstractDocumentQuery.Statistics,返回void。返回实例的方法实际上是作为显式接口方法实现的,因此动态调用不能调用它。