我创建了一个链接到TypeFilter
的{{1}}。
ActionFilter
的用途是在TypeFilter
的{{1}}中使用。
Action
具有一些必需的属性(在构造函数中要求)和一些可选参数。
但是由于存在一些可选属性,并且将来可能还会更多,因此创建支持每种组合的构造函数的机会不大。为了解决这个问题,我在TypeFilter中创建了公共属性,以便能够在属性中设置它们,如下例所示:
Controller
TypeFilter
示例代码如下:
[HttpGet]
[TypeTestFilter(typeof(WeatherForecast), "myparam1", "myparam2", "myparam2", MaxValue = 10, MinValue = 1)]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
如您所见,TypeFilter
和public class TypeTestFilter : TypeFilterAttribute
{
public int MaxValue { get; set; }
public int MinValue { get; set; }
public TypeTestFilter(Type type, params string[] parameterNames) : base(typeof(TypeTestActionFilter))
{
this.Arguments = new object[]
{
type,
parameterNames,
MaxValue,
MinValue
};
}
private class TypeTestActionFilter : IActionFilter
{
private readonly Type _type;
private readonly string[] _parameterNames;
private readonly int _maxValue;
private readonly int _minValue;
public TypeTestActionFilter(Type type, string[] parameterNames, int maxValue, int minValue)
{
_type = type;
_parameterNames = parameterNames;
this._maxValue = maxValue;
this._minValue = minValue;
}
public void OnActionExecuting(ActionExecutingContext context)
{
// code.
}
public void OnActionExecuted(ActionExecutedContext context)
{
// code.
}
}
}
是构造函数的参数。执行type
时,两个参数均正确设置了值。但是parametersNames
和TypeTestActionFilter
属性值均未设置。它们只是具有整数(0)的默认值。
我在这里想念什么?为什么没有使用MaxValue
的{{1}}中的MinValue
提供的值来设置这些属性?
如果需要,我可以上传示例项目。
答案 0 :(得分:0)
据我所知,属性说明如下:
[TypeTestFilter(typeof(WeatherForecast), "myparam1", "myparam2", "myparam2", MaxValue = 10, MinValue = 1)]
等于:
TypeTestFilter anonymousObject = new TypeTestFilter(typeof(WeatherForecast), "myparam1", "myparam2", "myparam2");
anonymousObject.MaxValue = 10;
anonymousObject.MaxValue = 1;
这意味着我们无法在TypeTestFilter的构造方法中获取最大值和最小值,因为它们没有设置。
要解决此问题,应将max和min值传递给构造方法,如下所示:
public TypeTestFilter(Type type , int minvalue, int maxvalue, params string[] parameterNames) : base(typeof(TypeTestActionFilter))
{
this.Arguments = new object[]
{
type,
parameterNames,
maxvalue,
minvalue
};
}
结果: