0

RavenDB は、データのクエリ用、IDocumentQuery<T>高度な lucene クエリIRavenQueryable<T>用、および厳密に型指定された linq プロバイダー モデル用の 2 つの API を提供します。

Statistics(out RavenQueryStatistics stats)これらは、実行時に情報を返すというメソッドを共有しています。

2 つの異なるメソッド シグネチャは次のとおりです。

  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 に答える