c#把一句字符串类型的表达式代码变成一句可以被编译执行的代码

qq_35693863 2017-07-04 11:53:56

我想要做的操作就是:
因为我不知道到底有多少条数据需要放进去判断,所以我想了一个办法就是先用string的变量把所有的值以及判断表达式写好存进去,然后在linq查询中直接把字符串的代码变成可以执行的表达式?目前就是不知道该怎么转换成可以执行的表达式。求大神们帮帮忙
...全文
429 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35693863 2017-07-05
  • 打赏
  • 举报
回复
没用。。。楼上的楼上的那个办法,类型不能放一个集合或者是数组,最后还是要循环比较,对我没用。。 楼上的那个办法在我的项目中还是没用
threenewbee 2017-07-04
  • 打赏
  • 举报
回复
用dlinq,一个第三方库,可以把字符串转换成表达式树,和你说的需求类似。
qq_35693863 2017-07-04
  • 打赏
  • 举报
回复
c#里面是不是不可以把一个字符串类型的表达式代码转换为一个可以执行的代码,我百度过,但是百度说的都是动态编译,但是那并不能完成我的需求,动态编译最后返回显示的还是一个结果,它不能返回一段c#代码给我。有没有人知道该怎么解决啊。
qq_35693863 2017-07-04
  • 打赏
  • 举报
回复
??动态?怎么写?我可不知道我到底有多少个值需要判断哦
ilikeff8 2017-07-04
  • 打赏
  • 举报
回复
dynamic linq
  • 打赏
  • 举报
回复
另一种方法

   String split = "张李王";
            List<Func<Char, Boolean>> wheres = new List<Func<char, bool>>();
            foreach (char item in split)
            {
                Func<Char, Boolean> func = (t) => t == item;
                wheres.Add(func);
            }
            var list = new List<Char>();
            foreach (var where in wheres)
            {
                list = list.Union(split.Where(t => where(t))).ToList();
            }
            Console.WriteLine(list.Count);
            Console.Read();
ilikeff8 2017-07-04
  • 打赏
  • 举报
回复
项目管理nuget程序包里搜索 System.Linq.Dynamic

        class simple
        {
           public  int number;
        }

        static List<simple> list = new List<simple>
            {
                new simple {number=1},
                new simple {number=2},
                new simple {number=3},
                new simple {number=4},
                new simple {number=5}
            };

        static void Main(string[] args)
        {

            var do1 = EvalEx.GetEval<Func<simple, bool>>(typeof(simple), "number!=1 && number!=2");


            Console.Write(string.Join(",",(from d in list
                                           where do1.Invoke(d)
                                           select d.number.ToString()).ToList()));
            Console.Read();
        }

        static class EvalEx
        {
            public static T GetEval<T>(Type type, string propertyPath)

            {

                if (type == null)

                    return default(T);

                var func = System.Linq.Dynamic.DynamicExpression.ParseLambda(type, null, propertyPath);

                var objParameter = System.Linq.Expressions.Expression.Parameter(typeof(object), "obj");

                var objConvert = System.Linq.Expressions.Expression.Convert(objParameter, type);

                var objInvoke = System.Linq.Expressions.Expression.Invoke(func, objConvert);

                var resultExpression = System.Linq.Expressions.Expression.Lambda<T>(objInvoke, objParameter);

                return resultExpression.Compile();
            }
        }
qq_35693863 2017-07-04
  • 打赏
  • 举报
回复
我知道或者也是可以追加的但是,加了之后它就是和并且并级了,它本身是并且下面的一个子表达式,可是现在变成了和它同级的了,这样完成不了要显示的效果。
闭包客 2017-07-04
  • 打赏
  • 举报
回复
引用 8 楼 qq_35693863 的回复:
因为最外层已经有并且了,所以我只能在里面写或者了,因为它是属于一个并且的里面的或者的。所以你说的那个在后面追加是不可能的事 @closurer
【逻辑与】、【逻辑或】都是可以追加的。
qq_35693863 2017-07-04
  • 打赏
  • 举报
回复
因为最外层已经有并且了,所以我只能在里面写或者了,因为它是属于一个并且的里面的或者的。所以你说的那个在后面追加是不可能的事 @closurer
qq_35693863 2017-07-04
  • 打赏
  • 举报
回复

这是项目需求,因为我要在and里面写或者,我才想出这个办法,你能有更好的方法?
闭包客 2017-07-04
  • 打赏
  • 举报
回复
笼统地说,C# 是静态语言,并不能提供 javascript 一样的 eval 函数。 但是现在的 roslyn 编译器已经可以把 C# 作为脚本执行。 不过回到问题的出发点,什么样的需求才必须动态编译,或者非解释执行不可?你这个需求必须使用解释型的脚本吗? 我的答案是否定的,lambda 的 Where 方法,本身就是延时执行的函数,Where 之后还可以继续 Where 追加条件……

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧