在你的 C# 项目当中集成对 LUA 的动态解析支持

在C#当中你可以使用Neo.Lua这个第三方库来集成LUA支持,并且你的LUA当中还能够编写并且使用.Net的库。 首先在Nuget包管理器当中下载并且安装Neo.Lua、Neo.Lua.Desktop这两个包,之后我们新建一个WinFrom项目,在这个项目上面我们拖放一个TextBox以及一个Button,在这里我们的TextBox的名字叫做textbox_LuaContent,Button的名字则为button_Test。 建立好之后,我们在button_Test的响应函数里面编写如下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 private void button_Test_Click(object sender, EventArgs e) { try { using (var _lua = new Lua()) { // 初始化环境 dynamic _g = _lua.CreateEnvironment<LuaGlobal>(); // 绑定函数委托 _g.print = new Action<string>(print); // 编译代码成可执行的数据块 var _chunk = _lua.CompileChunk(textbox_LuaContent.Text, "Test.lua", new LuaCompileOptions() { DebugEngine = LuaStackTraceDebugger.

C# 的三种对象深拷贝方法

实现ICloneable 接口,自定义拷贝功能 序列化/反序列化类实现 通过反射来创建新的对象实例 No.1 实现ICloneable接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 publi class Person : ICloneable { public int Age { get; set;} public string Address { get; set; } public string Name { get; set; } public Object Clone() { Person _temp = new Person(); _temp.Address = this.Address; _temp.Age = this.Age; _temp.Name = this.Name; return _temp; } } No.2 序列化/反序列化类实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [Serializable] public class Person :ICloneable { public object Clone() { using(MemoryStream _ms = new MemoryStream(1000)) { object _cloneObject; BinaryFormatter _bf = new BinaryFormatter(null,new StreamingContext(StreamingContextStates.

SQL Server 中关于 text 类型是否为空的判断

在SQLServer当中对于NText,Text,XML以及Image类型的数据没有比较机制,如果直接书写以下代码会出现错误: 1 WHERE Descript = '' --会报错:数据类型 text 和 varchar 在 equal to 运算符中不兼容。 并且在LINQ TO SQL 当中也会提示NotSupportedException4异常:SQL Server 未处理 NText、Text、Xml 或 Image 数据类型的比较。 So,只能利用强制类型转换转换为nvarchar进行比较,或者判断长度是否为0这样来进行操作啦。

C# 使用位操作符实现简单的权限操作

在Linux下对文件或者目录赋权限的时候其实就是使用了位运算来对一个State标志位进行操作。 因为在二进制中0001,0010,0100,1000,等以此类推,这几个数字进行按位于或者按位或操作的话会有一些神奇的事情发生。 常见的位运算主要是,与&、或|、非~这三种,这三种运算符的特性跟逻辑操作服差不多,1是true,0是false而已,只不过这里运算规则是这种: 1 & 0 = 0 1| 0 = 1 ~1 = 0 首先我们来建立一个枚举如下: 1 2 3 4 5 6 7 8 [Flags] public enum TestEnum { Insert = 1, Delete = 2, Query = 4, Update = 8 } 这里的[Flags]特性的作用是让被修饰的枚举支持位运算操作,而每个枚举的值我们使用2的n次方进行赋值,那么这里就表示为了: 0001 0010 0100 1000 然后这里的二进制位每一位1代表有某种权限,0则代表没有,例如0011则说明拥有Insert与Delete两种权限。那么我们根据位运算的法则,如果要让一个State标志位拥有两种权限,则只需要将其进行或运算即可,例如0001 | 0010 = 0011,换成代码来说如下: 1 2 3 4 5 6 7 TestEnum permissions = TestEnum.Insert | TestEnum.Delete; // 简化写法 TestEnum permissions |= TestEnum.

使用 SqlBulkCopy 进行大批量数据库插入

当涉及新老系统迁移的时候,可能同一个模块的数据表结构变化十分大,则需要通过编写一些程序来进行一些转换操作,转换完之后尝尝少则几万条数据,多则几十万条,如果一条一条的插入所消耗的时间成本是十分昂贵的。 那么在C#当中则提供了SqlBulkCopy类,它存在于System.Data.SqlClient命名空间下,该类可以进行大批量的数据插入,并且效率十分快。 经过测试,耗时时间如下: 十万条数据:2.2051s 一万条数据:0.2188s 一千条数据:0.0187s 效率十分的高,但是该类仅支持DataTable操作,一般来说Dapper以及EF框架读出来的都是一个IEnumerable,所以我们需要通过反射来构建一个DataTable进行操作。这里我写了一个静态泛型方法,可以直接传入IEnumerbale对象来批量插入数据: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 static void BulkInsertAll<T>(IEnumerable<T> entities,String connectString) { var conn = new SqlConnection(connectString); conn.Open(); Type t = typeof(T); var tableAttribute = (TableAttribute)t.GetCustomAttributes(typeof(TableAttribute), false).Single(); var bulkCopy = new SqlBulkCopy(conn) { DestinationTableName = tableAttribute.
Built with Hugo
主题 StackJimmy 设计