Dynamic 动态调用RavenDB统计方法而不考虑查询源
RavenDB提供了两个用于查询数据的API,Dynamic 动态调用RavenDB统计方法而不考虑查询源,dynamic,reflection,ravendb,invoke,out,Dynamic,Reflection,Ravendb,Invoke,Out,RavenDB提供了两个用于查询数据的API,IDocumentQuery用于高级lucene查询,IRavenQueryable用于强类型linq提供程序模型 它们共享一个名为Statistics(out-RavenQueryStatistics)的方法,该方法在运行时返回信息 两种不同的方法签名是: public interface IRavenQueryable<T> .... { IRavenQueryable<T> Statistics(out
IDocumentQuery
用于高级lucene查询,IRavenQueryable
用于强类型linq提供程序模型
它们共享一个名为Statistics(out-RavenQueryStatistics)
的方法,该方法在运行时返回信息
两种不同的方法签名是:
public interface IRavenQueryable<T> ....
{
IRavenQueryable<T> Statistics(out RavenQueryStatistics stats);
您正在查看接口定义,但事实证明,动态调用最终会调用AbstractDocumentQuery.Statistics,它返回void。
返回实例的方法实际上是作为显式接口方法实现的,因此动态调用无法调用它。所以这根本不可能?这不是我所希望的,但感谢您亲自回答。
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