属性中的字典
本文关键字:字典 属性 | 更新日期: 2023-09-27 18:08:43
我有一个REST Web Api端点,它可以接收查询参数。
其中一些查询参数用于生成具有内部模型属性的LINQ表达式。例如:
http://api.example.com/scenes?episode=32
查询参数episode
生成LINQ表达式:
s => s.Episode == 32
使用哪个属性进行比较是在每个查询参数具有的属性中指定的:
public class SceneQueryData
{
[PropertyFilter("Episode")]
public int? Episode { get; set; }
}
我说的是:"Hey, use this "episode" query parameter as a filter for the "Episode" property of the model"
。
现在,生成的表达式是一个简单的相等比较(=
),所以我需要更复杂的操作(<, <=, >, >=
),因为我可以在属性中设置一个额外的成员:
[PropertyFilter("Episode", QueryOperations = new Dictionary<string, QueryOperation>()
{
{ "le", QueryOperation.LessThanOrEquals },
{ "lt", QueryOperation.LessThan },
{ "ge", QueryOperation.GreaterThanOrEquals },
{ "gt", QueryOperation.GreaterThan }
}]
这将允许我进行查询,如scenes?episode.le=20
,这将被翻译为
e => e.Episode <= 20.
但是,我不能将字典作为属性参数传入,所以我需要使用属性的另一种方法来完成此。 用AttributeUsage定义一个单独的属性(比如OperationAttribute),使AllowMultiple = true。然后使用单独的OperationAttribute指定您将放在字典中的每个键值对。像这样:[AttributeUsage(System.AttributeTargets.Property, AllowMultiple = true)]
public class OperationAttribute : Attribute
{
public OperationAttribute(string name, QueryOperation op)
{
...etc...
}
}
public class SceneQueryData
{
[PropertyFilter("Episode")]
[Operation("le", QueryOperation.LessThanOrEquals)]
[Operation("lt", QueryOperation.LessThan)]
[Operation("ge", QueryOperation.GreaterThanOrEquals)]
[Operation("gt", QueryOperation.GreaterThan)]
public int? Episode { get; set; }
}