C# ter被执行,因为我在所属类中定义了一个方法InputNum

C# ter被执行,因为我在所属类中定义了一个方法InputNum,c#,.net,linq,dsl,C#,.net,Linq,Dsl,我觉得这是努力和最终结果之间的一个很好的平衡。我向任何需要解析简单语句的人推荐逃离,特别是如果您需要使用自己的变量和函数扩展这些语句。我最终使用了一种不同的方法。我不再让用户选择任意字段并生成任意图形,而是提供了罐装图,但我使用它让用户准确过滤出图形源中使用的数据。这很好,因为我最终创建了一组从变量名到“访问器”的映射,然后使用这些映射将变量注入到用户输入的过滤器中。结果是: List<Mapping<Person>> mappings; // ... mappings.

我觉得这是努力和最终结果之间的一个很好的平衡。我向任何需要解析简单语句的人推荐逃离,特别是如果您需要使用自己的变量和函数扩展这些语句。

我最终使用了一种不同的方法。我不再让用户选择任意字段并生成任意图形,而是提供了罐装图,但我使用它让用户准确过滤出图形源中使用的数据。这很好,因为我最终创建了一组从变量名到“访问器”的映射,然后使用这些映射将变量注入到用户输入的过滤器中。结果是:

List<Mapping<Person>> mappings;
// ...
mappings.Add(new Mapping("Weight", p => p.Weight, "The person's weight (in pounds)"));
// ...
foreach (var m in mappings)
{
    context.Variables[m.Name] = m.Accessor(p);
}
// ...
列表映射;
// ...
添加(新映射(“权重”,p=>p.Weight,“人的体重(以磅为单位)”);
// ...
foreach(映射中的var m)
{
context.Variables[m.Name]=m.Accessor(p);
}
// ...
您甚至可以为表达式上下文指定一个“所有者”(想想Ruby的
实例_eval
,其中使用指定对象的分数执行上下文,即
this
);然后,用户甚至可以输入一个过滤器,如
Weight>InputNum(“要查看的最小权重”)
,然后在执行过滤器时会提示他们,因为我在所属类中定义了一个方法
InputNum


我觉得这是努力和最终结果之间的一个很好的平衡。我建议任何需要解析简单语句的人逃离,特别是如果您需要使用自己的变量和函数扩展这些语句。

作为额外的警告,您可能会在用户上添加一些模拟,这些用户基本上只能对应用程序域中的某些对象进行操作。或者在进行选择的方法中使用Deny执行一些代码AccessSecurity。作为额外的警告,您可能会在用户上添加一些模拟,这些用户基本上只能对应用程序域中的某些对象进行操作。或者在执行选择的方法中使用Deny执行一些代码AccessSecurity。
SELECT Name, AVG(WeighIns) FROM People
SELECT WeightInKg, Owner.HeightInCm FROM Weights
SELECT WeightInKg, (Date - Owner.BirthDate) AS Age FROM Weights
var personRequest = Request<Person>();
personRequest.Item("Name", (p => p.Name));
personRequest.Item("HeightInCm", (p => p.HeightInCm));
personRequest.Item("HeightInInches", (p => p.HeightInCm * CM_TO_INCHES));
// ...
var weightRequest = Request<Weight>();
weightRequest.Item("Owner", (w => w.Owner), personRequest); // Indicate a chain to personRequest
// ...
var people = Table<Person>("People", GetPeopleFromDatabase());
var weights = Table<Weight>("Weights", GetWeightsFromDatabase());
// ...
TryRunQuery(userInputQuery);
from p in people select (p => { System.IO.File.Delete("C:\\something\\important"); return p.Name })
List<Mapping<Person>> mappings;
// ...
mappings.Add(new Mapping("Weight", p => p.Weight, "The person's weight (in pounds)"));
// ...
foreach (var m in mappings)
{
    context.Variables[m.Name] = m.Accessor(p);
}
// ...