You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否抽象参数重复的密封DllImportAttribute?继承尝试失败求方案

简化重复的User32.dll DllImport特性的方案

嗨,我明白你想简化重复写的[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]特性的需求,可惜DllImportAttribute被标记为sealed(密封类),确实没法直接继承它来创建自定义特性——不过没关系,咱们有几种靠谱的替代方案:

方案1:封装到静态类(最推荐,简单直接)

把所有需要调用的User32.dll方法统一放到一个静态类里,只在这个类里写一次重复的DllImport参数,其他地方直接调用这个类的方法就行,彻底避免重复写特性:

using System;
using System.Runtime.InteropServices;

public static class User32
{
    // 统一的DllImport参数只写一次在这里
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    // 把所有需要的User32 API都添加到这个类里
}

之后在其他代码里直接调用:

User32.ShowWindow(windowHandle, 5); // SW_SHOW

方案2:用源代码生成器实现自定义特性语法

如果你确实想要类似[User32]的语法糖,可以借助Roslyn源代码生成器来实现。步骤大概是:

第一步:定义自定义特性

先创建一个普通的自定义特性(不用继承DllImport):

using System;

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public sealed class User32Attribute : Attribute
{
    // 可以设置默认参数,和你常用的DllImport配置对齐
    public CharSet CharSet { get; set; } = CharSet.Auto;
    public bool SetLastError { get; set; } = true;
}

第二步:编写源代码生成器

写一个Roslyn生成器,扫描所有带有[User32]特性的方法,自动生成对应的带有完整DllImport特性的方法实现。这个需要你了解一点Roslyn源代码生成的知识,但能完美实现你想要的[User32]语法效果。

方案3:用代码片段快速输入

如果只是不想手动重复敲长串的特性,可以在Visual Studio里自定义代码片段:

  1. 打开「工具」→「代码片段管理器」
  2. 选择C#语言,添加一个新的代码片段
  3. 把[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]设为代码片段的内容,设置一个简短的触发词(比如user32import)

之后在代码里输入触发词,按Tab就能自动生成完整的特性,输入效率也很高。

内容的提问来源于stack exchange,提问作者byxor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:51:13