动态调用RavenDB Statistics方法,而不考虑查询源



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。返回实例的方法实际上是作为显式接口方法实现的,因此动态调用不能调用它。

相关内容

  • 没有找到相关文章

最新更新