WinFrom、C# 学习记录三
2021/6/5 12:24:16
本文主要是介绍WinFrom、C# 学习记录三,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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();
这篇关于WinFrom、C# 学习记录三的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具