簡體   English   中英

如何使用Reflection從屬性調用方法

[英]How to call a method from of a property using Reflection

我在應用程序中使用nhibernate,我有一個映射模型與一些關系。 這些關系是使用List<T>進行映射的,我需要將一個實體傳遞給一個方法並調用Any()方法來檢查每個關系上是否有寄存器。

我嘗試這樣做但是當我從PropertyInfo調用GetValue()方法時,NHibernate將加載所有內容,但我只需調用Any()方法來提高性能,而nhibernate將查詢一個簡單的查詢來檢查。 我試試這個:

var type = entity.GetType();
foreach (var propertyInfo in type.GetProperties().Where(p => typeof (IEnumerable<>).IsAssignableFrom(p.PropertyType)))
{
   // it works, but load everything just to check if there are something...
   var collection = propertyInfo.GetValue(entity) as IEnumerable<dynamic>;

   if (collection != null)
      bool has = collection.Any();

}

我想在這里調用IEnumerable.Any(),但是如何在沒有GetValue的情況下使用反射來執行此操作?!

Any是一種擴展方法,所以如果你想找到它,請查看這篇文章: 反映識別擴展方法

但實體仍會加載整個列表,因為Any方法需要整個列表來應用搜索模式(即使它是空的)。

在集合上調用Enumerable.Any()將導致初始化,因為實現會讀取以查看是否存在元素。

相反,如果你用lazy="extra"映射你的集合,你可以檢查Count == 0 (這是一個ICollection<T>方法,如果你使用dynamic ,你可以輕松調用它。

或者,您可以安裝NHibernate.CollectionQuery ,使用可查詢的集合類型映射集合,並調用collection.AsQueryable().Any()

您正在將IQueryable Any()擴展方法與IEnumerable Any()擴展方法混合使用。

如果你在NHibernate Linq查詢中調用Any() (由session.Query<EntityType>() ),NHibernate會發現你只想知道是否有一個元素。 它可以這樣做,因為在這種情況下,您正在使用IQueryable的擴展方法,並且正在創建表達式樹而不是在擴展方法中執行代碼。

但是如果在實體內部的持久集合上調用Any() ,則只執行擴展方法的代碼。 NHibernate看到這就像對集合的任何其他訪問一樣,並加載整個集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM