WinFrom、C# 学习记录三

c#根据字符串公式进行自动计算的实现

方式一:

只支持32位

其所在程序集为Interop.MSScriptControl.dll,组件名称为Microsoft Script Control 1.0。
    操作:“添加引用” -- “COM” -- “类型库”,找到“Microsoft Script Control 1.0”组件,“确定”。参WinFrom、C# 学习记录三

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();

 

上一篇:C#只允许启动一个WinFrom进程


下一篇:WinFrom打包成安装包教程