c#根据字符串公式进行自动计算的实现
方式一:
只支持32位
其所在程序集为Interop.MSScriptControl.dll,组件名称为Microsoft Script Control 1.0。
操作:“添加引用” -- “COM” -- “类型库”,找到“Microsoft Script Control 1.0”组件,“确定”。参
private void InvokeJS() {
MSScriptControl.ScriptControlClass sc = new MSScriptControl.ScriptControlClass();
sc.Language = "javascript";
object obj = sc.Eval(" 'AA' + 1 + ( 2 + 3 ) ");
//Console.WriteLine(obj);
Response.Write(obj);
}
输出:AA15。
方式二: 添加Microsoft.JScript的引用
微软官方说法,不推荐使用这种类型,因为它在 Visual Studio 2005 中已被弃用; 此功能没有替代品。 请参阅 ICodeCompiler 文档以获取更多帮助。
private string CaleByFormule(string Formule)
{
Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(Formule, ve).ToString();
}
方式三:代码实现
1、不支持sin、cos等数学函数
2、不支持[]、{}等括号和除数字、+、-、*、/以外的字符,建议调用计算函数前进行输入的验证。
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;
using Microsoft.CSharp;
namespace Expression
{
/// <summary>
/// 计算表达式的类
/// </summary>
public class CalculateExpression
{
/// <summary>
/// 接受一个string类型的表达式并计算结果,返回一个object对象,静态方法
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public static object Calculate(string expression)
{
string className = "Calc";
string methodName = "Run";
expression = expression.Replace("/", "*1.0/");
//设置编译参数
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
//创建动态代码
StringBuilder classSource = new StringBuilder();
classSource.Append("public class " + className + "\n");
classSource.Append("{\n");
classSource.Append(" public object " + methodName + "()\n");
classSource.Append(" {\n");
classSource.Append(" return " + expression + ";\n");
classSource.Append(" }\n");
classSource.Append("}");
//编译代码
CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(paras, classSource.ToString());
//获取编译后的程序集。
Assembly assembly = result.CompiledAssembly;
//动态调用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect();
return reobj;
}
}
}
调用
object objCalc = Calculate("((1 + 2) * 3 + 6) / 5 ");
Console.WriteLine(objCalc.ToString()); //结果为3
Console.ReadLine();
C#类型扩展方法—this参数修饰符
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
namespace MyTest
{
public static class MyTestExtensions
{
public static int CalcWordCount(this String str)
{
return str.Length + 1;
}
}
}
调用
using ExtensionMethods;
string s = "abcde";
int i = s.WordCount();
c#参数修饰符-params
params可以设置使用长度可变的参数。
使用要求:
1.在一个方法声明的参数中,只能有一个params修饰符,且被修饰的参数之后不能有其他参数(这一点就像“可选参数必须在必选参数之后”的原则一样);
2.传递参数时分三种情况,分别是:
a.参数为指定类型的数组;
b.参数是用逗号分割的指定类型的参数列表;
c.不传递参数。
public void UseParams(params int[] arry)
{
for (int i = 0; i < arry.Length; i++)
{
Response.Write(arry[i] + "#");
}
}
调用方式一,输出 1#2#3#
int[] arry = { 1, 2, 3 };
UseParams(arry);
调用方式二,输出 4#5#
UseParams(4,5);
调用方式三,没有输出任何内容,原因是params的长度为零
UseParams();