编辑
2025-09-19
C#
00

LINQ (Language Integrated Query) 是 C# 语言的一个功能强大的组成部分,它允许开发者以声明式的方式查询和操作数据。LINQ Expressions 是 LINQ 的核心之一,提供了一种将查询逻辑表示为表达式树(Expression Trees)的方式。这篇文章深入探讨了 LINQ Expressions 的原理,并通过实例展示了它们的用法。

LINQ Expressions 原理

LINQ Expressions 基于表达式树构建。表达式树是一种数据结构,可以表示代码中的操作序列,如算术运算、方法调用或访问属性和字段。与普通的委托或匿名方法不同,表达式树的强大之处在于它们不是直接执行的代码,而是可以在运行时被检查、修改或执行的数据结构。

当你使用 LINQ to Objects 时,大部分工作是在内存中对集合进行操作。而当你使用 LINQ to SQL 或 Entity Framework 时,LINQ Expressions 允许框架将 C# 代码转换成 SQL 查询,这些查询然后可以在数据库上执行。这种转换是通过分析表达式树实现的。

基本使用

下面是一些基本的 LINQ Expressions 示例:

示例 1: 创建和执行表达式

C#
using System; using System.Linq.Expressions; class Program { static void Main() { // 创建一个表达式树 Expression<Func<int, int, int>> expression = (a, b) => a + b; // 编译表达式树以生成可执行的委托 Func<int, int, int> func = expression.Compile(); // 使用委托 int result = func(2, 3); Console.WriteLine(result); // 输出: 5 } }
编辑
2025-09-19
C#
00

在C#中,ExpandoObject类提供了一种灵活的方式来创建对象,其属性和方法可以在运行时动态添加和删除。这在处理动态数据或构建需要高度灵活性的应用程序时非常有用。本文将介绍ExpandoObject的基本概念、应用场景,并通过几个示例展示其用法。

基本概念

ExpandoObject是.NET Framework中的一个类,属于System.Dynamic命名空间。它实现了IDynamicMetaObjectProvider接口,允许在运行时动态地添加和删除成员(属性、方法等)。

ExpandoObject

  1. 类型ExpandoObject是一个类,定义在System.Dynamic命名空间中。它提供了一种在运行时动态添加和删除成员(属性、方法、事件)的能力。
  2. 用途ExpandoObject主要用于创建可以在运行时动态改变的对象。它实现了IDynamicMetaObjectProvider接口,使得对象可以在运行时动态地添加或删除属性和方法。
  3. 操作:通过ExpandoObject,可以轻松地将其实例转换为IDictionary<string, object>接口,从而对动态添加的成员进行枚举、添加、删除操作。
  4. 场景ExpandoObject非常适合需要动态数据模型的场景,比如JSON数据解析、动态配置管理等。

应用场景

1. 动态数据处理

在处理JSON或来自其他灵活数据源的数据时,ExpandoObject可以提供极大的便利。它允许你在不知道数据结构的情况下,动态地构建对象。

2. 设置和配置

在应用程序中处理设置和配置时,使用ExpandoObject可以让你轻松地在运行时添加或修改配置项,而不需要定义严格的类型。

3. 动态对象构建

在需要根据用户输入或其他运行时数据动态构建对象的场景中,ExpandoObject提供了一种灵活的解决方案。

示例

编辑
2025-09-19
C#
00

处理PDF文件时,我们可能需要提取文档中的特定信息,例如高亮的文本。这在法律文件、教科书或任何需要重点标注的文档中尤其常见。iText7是一个功能强大的库,它不仅可以用于创建和编辑PDF文件,还可以用于读取PDF中的内容,包括高亮的文字。本文将详细介绍如何使用iText7在C#中提取PDF文件中的高亮文字。

准备工作

在开始之前,请确保您的项目中已经安装了iText7库。如果尚未安装,可以通过NuGet包管理器添加iText7库。在Visual Studio中,可以通过“工具”->“NuGet包管理器”->“管理解决方案的NuGet包”搜索并安装itext7

image.png

方便读取中文,需要安装一下这个亚洲字体包

image.png

提取高亮文字

编辑
2025-09-19
C#
00

最近给客户做一个MES项目中,其中有一些表单打印需求,因为不能使用第三方的打印组件,刚开始想用excel套打,发现问题也不少,客户机可能不能安装excel,最后想来想去还不如自己draw一个表单打印得了。本文将详细介绍如何使用GDT+做一个表单打印,因为时间比较紧张,写的还不完善,够项目用了,也就一直没去完善了,估计不少项目上的兄弟都一样。。。

基本思路

将打印纸张切分为多行,多列,再根据行列索引定位。

比较麻烦的就是合并行或列,这里并没有真正的合并,而是通过FillRectangle来处理,算是讨巧了。

直接上代码

Table 绘制类

C#
using QRCoder; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Threading.Tasks; using static System.Windows.Forms.AxHost;
编辑
2025-09-19
C#
00

在开发基于 WinForms 的应用程序时,采用 MVVM(模型-视图-视图模型)设计模式可以显著提高应用程序的可维护性和可扩展性。CommunityToolkit.Mvvm 是一个强大的库,它提供了一系列工具和功能,帮助开发者在 WinForms 应用中实现 MVVM 设计模式。本文将重点介绍如何在 WinForms 应用程序中使用 CommunityToolkit.Mvvm 定义简单的数据模型,并通过数据注解进行模型验证。

定义简单的数据模型

在 MVVM 设计模式中,模型(Model)代表应用程序的数据和业务逻辑。在 CommunityToolkit.Mvvm 中,我们通常通过创建 POCO(Plain Old CLR Object)类来定义模型,并利用 ObservableObject 类实现属性变更通知。

示例:定义一个 Person 模型

C#
using CommunityToolkit.Mvvm.ComponentModel; public partial class Person : ObservableObject { private string name; private int age; public string Name { get => name; set => SetProperty(ref name, value); } public int Age { get => age; set => SetProperty(ref age, value); } }