0

RavenDB 提供 2 个 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
4

1 回答 1

1

您正在查看接口定义,但事实证明,动态调用最终调用 AbstractDocumentQuery.Statistics,它返回 void。返回实例的方法实际上是作为显式接口方法实现的,所以动态调用是调用不了的。

于 2013-02-12T11:06:00.877 回答