比如当前有两个类
class Model1
{
public string v1{get;set;}
}
class Model2
{
public string v1{get;set;}
}
上下文存在以下两个变量
Model1 m1=new Model1{v1="a"};
Model2 m2=new Model2{v1="b"};
当输入字符"m1.v1"或"m2.v1"时,可以分别取到"a"或"b"
对啊 有什么问题吗
你所谓的上下文是指执行时候的逻辑上下文还是什么?你有没有把这几个实例放到什么集合或类似static的字段里面?如果不这样做我感觉比较难从运行时随便输点啥就把堆栈中的玩意给输出出来。
Model1 m1=new Model1{v1="a"};
Model2 m2=new Model2{v1="b"};
private string someFunc(string str)
{
//这里处理或解析str的表达式,然后返回相应的值
//如果表达式错误或对象不存在返回null
return null;
}
Console.WriteLine(someFunc("m1.v1"));
Console.WriteLine(someFunc("m2.v1"));
应该可以输出
a
b
@duxer: 这m1,m2都在当前对象里面么?只有这两个么?你这个功能做的是干嘛的?
@Daniel Cai: 用来实现用户自定义的逻辑判断,比如A用户需要判断m1.v1==m2.v1,则A用户设置规则为“m1.v1==m2.v1”,而B用户需要判断m1.v1>=m2.v1,则B用户设置规则为“m1.v1>=m2.v1”。对象正常情况是存在的,但难免用户会输入错误。
@duxer: 感觉你这个是做规则引擎,如果需要灵活点有两种做法,一种很灵活的就是外接一些脚本语言,其他的我不是很清楚,但理论上类似python,lua都可以,当然也可以用roslyn来做。另一种是自己做语法解析,生成语法树后去执行,当然这个难度比较高,简单点的话可以用xml这些做,当做dsl。
但不管你怎么做的话你需要有个方法把m1,m2传入,你单传个待解析的字符串是不好做这个事的.
以前用roslyn做过类似的玩意,核心代码是用CSharpScript.Create方式创建一段脚本编译后去执行。类似的老版本的.net有个CodeDom还是啥的(记不太清楚了),也是带一段代码(文本),编译后执行。
就是解析表达式儿的值?