static double Evaluate(string expression) {
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof (double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (double) (loDataTable.Rows[0]["Eval"]);
}
解释它的工作原理:
首先,我们在var loDataTable = new DataTable(); 部分中创建一个表,就像在数据库引擎中一样(例如 MS SQL)。
然后是一列,带有一些特定参数 (var loDataColumn = new DataColumn("Eval", typeof (double), expression);)。
"Eval" 参数是列的名称(ColumnName 属性)。
typeof (double)是要存储在列中的数据类型,等于把System.Type.GetType("System.Double");改为。
expression是Evaluate方法接收到的字符串,存储在列的属性Expression中。此属性用于一个非常特定的目的(很明显),即放在列上的每一行都将用“表达式”填充,并且它实际上接受可以放入 SQL 查询的任何内容。请参阅http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression(v=vs.100).aspx 以了解可以在 Expression 属性中放入什么以及如何评估它。
然后,loDataTable.Columns.Add(loDataColumn); 将列 loDataColumn 添加到 loDataTable 表中。
然后,通过loDataTable.Rows.Add(0); 将一行添加到具有Expression 属性的个性化列的表中。当我们添加这一行时,表loDataTable的“Eval”列的单元格会自动填充其“Expression”属性,如果它有运算符和SQL查询等,它会被评估然后存储到单元格中,所以,这里发生了“魔术”,带有运算符的字符串被评估并存储到一个单元格中......
最后,只需将存储的值返回到第 0 行中“Eval”列的单元格(它是一个索引,从零开始计数),并使用 return (double) (loDataTable.Rows[0]["Eval"]); 转换为双精度数。
这就是全部……工作完成!
这里有一个更容易理解的代码,它的作用相同......它不在方法内部,它也被解释了。
DataTable MyTable = new DataTable();
DataColumn MyColumn = new DataColumn();
MyColumn.ColumnName = "MyColumn";
MyColumn.Expression = "5+5/5"
MyColumn.DataType = typeof(double);
MyTable.Columns.Add(MyColumn);
DataRow MyRow = MyTable.NewRow();
MyTable.Rows.Add(MyRow);
return (double)(MyTable.Rows[0]["MyColumn"]);
首先,用DataTable MyTable = new DataTable();创建表
然后,有DataColumn MyColumn = new DataColumn();的列
接下来,我们为列命名。这样我们就可以在它存储到表时搜索它的内容。通过MyColumn.ColumnName = "MyColumn";完成
然后是表达式,这里我们可以放一个字符串类型的变量,这里有一个预定义的字符串“5+5/5”,结果是6。
要存储到列MyColumn.DataType = typeof(double);的数据类型
将列添加到表中...MyTable.Columns.Add(MyColumn);
在表格中插入一行,复制表格结构DataRow MyRow = MyTable.NewRow();
使用MyTable.Rows.Add(MyRow);将行添加到表中
并返回表格MyTable和return (double)(MyTable.Rows[0]["MyColumn"]);的MyColumn列第0行单元格的值
课程结束!!!