2025-10-15
C#
00

什么是表达式树?

表达式树(Expression Trees)是一种以树形数据结构表示代码的方式,其中每个节点都是一个表达式。它允许我们在运行时检查、修改和执行代码。

为什么需要表达式树?

表达式树主要用于以下场景:

  • LINQ to SQL/Entity Framework 查询转换
  • 动态查询构建
  • 元编程
  • 代码分析和修改
  • 跨平台代码转换

创建表达式树

通过Lambda表达式创建

C#
using System.Linq.Expressions; namespace AppExpressionTrees { internal class Program { static void Main() { Expression<Func<int, bool>> lambda1 = num => num < 5; Console.WriteLine(lambda1.Compile().Invoke(4)); ParameterExpression numParam = Expression.Parameter(typeof(int), "num"); ConstantExpression five = Expression.Constant(5); BinaryExpression lessThan = Expression.LessThan(numParam, five); Expression<Func<int, bool>> lambda2 = Expression.Lambda<Func<int, bool>>( lessThan, new ParameterExpression[] { numParam } ); Console.WriteLine(lambda2.Compile().Invoke(4)); Console.ReadKey(); } } }

以上两种方式是一回事。

image.png

2025-10-15
C#
00

在实际开发中,我们经常需要处理耗时的异步操作,比如网络请求、文件读写等。有时候,我们可能需要取消这些正在进行的异步操作。本文将详细介绍如何在C#中实现异步操作的取消机制。

前置条件

  • .NET 5.0或更高版本
  • Visual Studio或Visual Studio Code
  • 基本的C#异步编程知识

核心概念

在开始之前,让我们了解几个重要的概念:

  1. CancellationTokenSource: 用于发出取消信号的源
  2. CancellationToken: 用于接收取消信号的令牌
  3. Task: 表示异步操作的对象

完整示例代码

下面是一个完整的示例,展示如何实现可取消的异步操作:

C#
using System.Diagnostics; namespace AppCancellationToken { internal class Program { // 创建取消令牌源 static readonly CancellationTokenSource s_cts = new CancellationTokenSource(); // 创建HttpClient实例 static readonly HttpClient s_client = new HttpClient { MaxResponseContentBufferSize = 1_000_000 }; // 待下载的URL列表 static readonly IEnumerable<string> s_urlList = new string[] { "https://learn.microsoft.com", "https://learn.microsoft.com/dotnet", "https://learn.microsoft.com/azure", "https://learn.microsoft.com/visualstudio" }; static async Task Main() { Console.WriteLine("程序启动..."); Console.WriteLine("按回车键取消下载...\n"); // 创建监听取消的任务 Task cancelTask = Task.Run(() => { while (Console.ReadKey().Key != ConsoleKey.Enter) { Console.WriteLine("按回车键取消下载..."); } Console.WriteLine("\n检测到回车键:正在取消下载...\n"); s_cts.Cancel(); }); // 创建下载任务 Task sumPageSizesTask = SumPageSizesAsync(); // 等待任意一个任务完成 Task finishedTask = await Task.WhenAny(cancelTask, sumPageSizesTask); if (finishedTask == cancelTask) { try { await sumPageSizesTask; Console.WriteLine("在处理取消请求之前下载任务已完成。"); } catch (OperationCanceledException) { Console.WriteLine("下载任务已被取消。"); } } Console.WriteLine("程序结束。"); } static async Task SumPageSizesAsync() { var stopwatch = Stopwatch.StartNew(); int total = 0; foreach (string url in s_urlList) { int contentLength = await ProcessUrlAsync(url, s_client, s_cts.Token); total += contentLength; } stopwatch.Stop(); Console.WriteLine($"\n总计下载字节数: {total:#,#}"); Console.WriteLine($"耗时: {stopwatch.Elapsed}\n"); } static async Task<int> ProcessUrlAsync(string url, HttpClient client, CancellationToken token) { HttpResponseMessage response = await client.GetAsync(url, token); byte[] content = await response.Content.ReadAsByteArrayAsync(token); Console.WriteLine($"{url,-60} {content.Length,10:#,#}"); return content.Length; } } }
2025-10-15
C#
00

简介

Microsoft.CSharp.RuntimeBinder 命名空间是 C# 动态语言运行时绑定的核心命名空间,主要用于支持动态编程特性。它包含了在运行时执行动态操作所需的类型,特别是在使用 dynamic 关键字时的底层实现。

主要用途

这个命名空间主要用于:

  • 支持动态类型的运行时绑定
  • 处理动态操作时的错误和异常
  • 提供动态调用的运行时支持

核心类

RuntimeBinderException

这是动态操作失败时抛出的主要异常类型。

RuntimeBinderInternalCompilerException

这是在动态绑定的内部编译过程中发生错误时抛出的异常。

实际应用示例

基本动态类型使用

C#
using Microsoft.CSharp.RuntimeBinder; namespace AppRuntimeBinder { internal class Program { static void Main(string[] args) { try { // 创建一个动态对象 dynamic dynamicObj = new System.Dynamic.ExpandoObject(); // 动态添加属性 dynamicObj.Name = "张三"; dynamicObj.Age = 25; // 正常访问 Console.WriteLine($"姓名: {dynamicObj.Name}, 年龄: {dynamicObj.Age}"); // 尝试访问不存在的属性(会抛出异常) Console.WriteLine(dynamicObj.Address); } catch (RuntimeBinderException ex) { // 捕获动态绑定异常 Console.WriteLine($"动态绑定错误: {ex.Message}"); } } } }

image.png

2025-10-15
C#
00

SimpleWifi 是一个优秀的C#开发库,用于简化WiFi网络的管理操作。本文将详细介绍其使用方法和实际应用场景。

环境准备

首先需要通过NuGet安装SimpleWifi包:

Bash
Install-Package SimpleWifi.netstandard.Lsh

image.png

2025-10-15
C#
00

.NET Compiler Platform (Roslyn) SDK提供了强大的语法分析和转换功能。本文将介绍如何使用Roslyn进行代码转换,包括两种主要方法:

  • 使用Factory方法创建和修改语法树
  • 使用SyntaxRewriter进行批量转换

环境准备

首先需要安装Visual Studio和.NET Compiler Platform SDK:

  1. 打开Visual Studio Installer
  2. 选择"修改"
  3. 可以通过以下两种方式之一安装:
    • 工作负载视图:选择"Visual Studio扩展开发"工作负载,然后在可选组件中勾选".NET Compiler Platform SDK"
    • 单个组件视图:直接勾选".NET Compiler Platform SDK"

image.png