簡體   English   中英

如何在屬性內使用反射來檢索有關調用它的類的信息

[英]How to use reflection inside an attribute to retrieve information about the class that called it

我遇到以下問題,

我得到了一個“汽車”類,該類具有使用EntityFramework到達數據庫並通過一些過濾器獲取所有表行的功能。

像這樣的東西:

public class car
{
     private const string VEHICLE_TYPE = "something_here";
    [CachedAttribute(30)]
    public virtual List<Vehicles> GetVehiclesFromDB()
    {
        return _repository.Set<Vehicles>().Where(e => e.VehicleType == VEHICLE_TYPE && e.Weight < CAR_MAX_WEIGHT);
    }
}

我還添加了一個屬性。 在此屬性內,我需要能夠檢索一些內容,

我需要獲取類名稱(在本例中為car),我還需要獲取函數的返回值的類型(在本例中為對象Vehicles),並且需要在VEHICLE_TYPE內部獲取值。

之后,我需要能夠從屬性內部執行該功能(“ GetVehiclesFromDB”)

public class CachedAttribute : Attribute
{
    public CachedAttribute(int seconds)
    {

      // todo
    }
}

我從來沒有做過那種事情,我不確定應該采取什么方法。 這是反思的情況嗎? 還是完全不同?

編輯:

我確實需要使用它進行緩存,我想使用Redis。

屬性類不必做任何事情,僅是數據。

調用GetVehiclesFromDB類必須檢查car類是否具有某些屬性,並更改結果的邏輯。

要獲得更多幫助,您可以查看以下文章

除了信息之外,我們還能做什么? ”部分。

錯誤..這不是屬性的目的。 他們提供有關元素的信息,但不能與它進行交互。

從您聲明的屬性名稱來看,我想您想要做的事情與此類似:

private List<Vehicles> _vehicles;
public List<Vehicles> Vehicles {
    get {
        if(_vehicles == null) {
            _vehicles = _repository.Set<Vehicles>().Where(e => e.VehicleType == VEHICLE_TYPE && e.Weight < CAR_MAX_WEIGHT);
        }
        return _vehicles;
    }
}

顯然,我只是在猜測您的意圖,因此這可能與您的意圖不符,但希望它能使您走上正確的道路。 例如,如果要全局緩存列表,則可以使用HttpContext.Current.Cache(如果正在開發Web應用程序)來存儲值。

屬性的目的是提供元數據或執行任何請求過濾,例如身份驗證/授權/日志記錄。

如果要緩存該方法的輸出,請考慮查看以下方法

  1. 如果使用ASP.NET MVC Action方法,則使用OutputCache屬性。
  2. 使用使用反射的實用程序類方法( 訪問自定義屬性 )檢查GetVehiclesFromDB方法的自定義屬性,並根據CacheAttribute參數(例如生存時間等)將返回值緩存到redis緩存中。此邏輯應在調用方法中GetVehiclesFromDB的示例

希望這可以幫助。

暫無
暫無

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

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