0

我正在尝试一种动态方式来定义需要应用于报告中数据的条件规则。我想要的是允许最终用户在配置中指定条件,然后在运行报告时编译和执行。

现在,如果在代码中完成,我会得到类似下面的代码。

      public int showTopEntries{get; set;}
. . . . 

showTopEntries = showTopEntries >= totalEntries ? totalEntries : showTopEntries;

但是,由于我希望用户在文本文件中提供此规则,在该文件中以代码的形式读取和翻译该规则。请问如何将表单(下面)的字符串解析为上面的语句?

PropertyToSet="showTopEntries" 条件="showTopEntries >= totalEntries" ifTrue="totalEntries" ifFalse="showTopEntries"

最终,我希望用户在表单中定义规则

<IfCondition>
    <WhenTrue><\WhenTrue>
    <WhenFalse>
        <IfCondition>
            <WhenTrue>
                <IfCondition>
                    . . . . .
                <\IfCondition>
            <\WhenTrue>
        <\IfCondition>
    <\WhenFalse>
<\IfCondition>

基本上,如果我有一个对象

公共类 PersonDetail { 公共字符串名称 {get; 设置;}公共字符串描述{get; 设置;}公共字符串年龄{get; 设置;}公共布尔活{get; 设置;}公共婚姻状态婚姻状态{得到;设置;}公共地址地址{get; 放;} }

我需要使用以下表达式对名称进行条件替换,比如子字符串

  public static class  DetailExtender
     {
          public static void EvaluateConditionalFieldRule(this PersonDetail Detail, String PropertyToEvaluate, String ConditionalExpression, List<String> parameters, String IfTrue, String ifFalse)
          {
               var property =  Detail.GetType().GetProperties().Where(x=>x.Name == PropertyToEvaluate);
               if (property == null)
                    throw new InvalidDataException("Please specify a valid  Detail property name for the evaluation.");
               //put together the condition like so 

               if (Detail.AsQueryable().Where(ConditionalExpression, parameters).Count() > 0)
               {
                    // property.Value = IfTrue;
               }
               else
               {
                    property.Value = ifFalse;
               }

          }
}

提前感谢您的建议。

4

1 回答 1

1

查看Dynamic LINQ,它提供了让您将 a 传递string给扩展的Where(string)扩展,并为您动态构建谓词:

string filter = MyConfig.GetString("Condition");
// filtered string is "Condition ="showTopEntries >= totalEntries"
var filtered = dataSource.Where(filter);
于 2013-09-06T15:14:48.977 回答