属性中的字典

本文关键字:字典 属性 | 更新日期: 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; }
}

属性中的字典