属性变通方法中的词典

时间:2015-08-19 21:15:01

标签: c# .net reflection

我有一个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.

但是,我不能将字典作为属性参数传递,因此我需要另一种方法来完成使用属性

1 个答案:

答案 0 :(得分:0)

使用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; }
}