如何在属性中使用反射来检索有关调用它的类的信息

时间:2017-02-28 08:24:01

标签: c# reflection attributes

我遇到了以下问题,

我有一个类'Car',其函数使用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);
    }
}

我还在其上添加了一个属性。在这个属性中,我需要能够检索一些东西,

我需要获取班级名称(在这种情况下是汽车), 我还需要获取函数返回值的类型(在本例中为对象Vehicle) 我需要在VEHICLE_TYPE中获取值。

之后我需要能够从属性中执行该函数('GetVehiclesFromDB')

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

      // todo
    }
}

我从未做过那种事情,我不确定我应该采取什么方法。这是反思吗?或者它可能是完全不同的东西?

编辑:

我确实需要将它用于缓存,我想使用Redis。

3 个答案:

答案 0 :(得分:0)

属性类不必做任何事情,它只是数据。

调用GetVehiclesFromDB的类必须检查car类是否具有某些属性,并使用结果更改逻辑。

要获得更多帮助,您可以在

中查看此article

&#34; 除了信息之外我们还能做些什么?&#34;部分。

答案 1 :(得分:0)

错误..那不是什么属性。它们提供有关元素的信息,但它们无法与之交互。

从您声明的属性的名称,我猜你想要做的是类似的事情:

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应用程序)来存储值。

答案 2 :(得分:0)

属性的目的是提供元数据或执行任何请求过滤,例如身份验证/授权/日志记录。

如果要缓存方法的输出,请考虑以下方式

    对于ASP.NET MVC Action方法,
  1. OutputCache属性。
  2. 使用实用类方法,该方法使用反射(Access Custom Attributes)检查 GetVehiclesFromDB 方法的自定义属性,并根据 CacheAttribute 将返回值缓存到redis缓存参数例如生存时间等。此逻辑应该在 GetVehiclesFromDB 的调用方法中。
  3. 希望这有帮助。