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

C#结构体属性标注MarshalAs编译报错的最优解决方案咨询

问题原因

[MarshalAs]特性的官方适用范围仅为字段、方法参数、方法返回值三类声明。你将特性加在自动属性上,自动属性属于属性声明类型,不在特性的有效作用范围内,因此触发编译报错。同时自动属性的底层后备字段由编译器隐式生成,你无法直接给该隐式字段附加封送特性,会导致原有封送逻辑失效。

最优修复方案

采用「显式声明私有封送后备字段 + 公开绑定属性」的组合写法,既保留原生非托管封送能力,又能对外提供属性供ListView作为项源绑定使用,修改后的代码如下:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct FileExplorerData
{
    // 私有后备字段,附加封送特性
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 251)]
    private string _name;
    [MarshalAs(UnmanagedType.Struct)]
    private FILETIME _lastwrite;
    [MarshalAs(UnmanagedType.U1)] // 匹配非托管1字节布尔类型,避免默认4字节导致的内存错位
    private bool _type;
    private int _size;

    // 公开属性,供UI绑定使用
    public string name 
    { 
        get => _name; 
        set => _name = value; 
    }
    public FILETIME lastwrite 
    { 
        get => _lastwrite; 
        set => _lastwrite = value; 
    }
    public bool type 
    { 
        get => _type; 
        set => _type = value; 
    }
    public int size 
    { 
        get => _size; 
        set => _size = value; 
    }
}
方案优势
  • 完全兼容原有非托管封送逻辑,结构体的内存布局、封送行为和修改前无差异
  • 对外保留公开属性定义,无需修改上层ListView绑定逻辑
  • 无额外性能开销,属性读写仅为字段的直接包装

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:27:03