如何为C#属性的Setter单独添加SupportedOSPlatformAttribute
给属性的Setter单独标记平台支持
有些属性的getter全平台可用,但setter仅支持特定平台(比如Console.WindowWidth的getter全平台兼容,setter仅支持Windows)。在封装这类属性时,我们需要让编译器准确识别getter和setter的平台差异。
错误尝试分析
- 直接封装属性:会触发
Console.WindowWidth.set的平台兼容性警告,因为该setter本身仅支持Windows:
public int WindowWidth { get => Console.WindowWidth; set => Console.WindowWidth = value; // 触发警告 }
警告内容:
此调用站点可在所有平台访问。'Console.WindowWidth.set'仅支持:'windows'。
- 给整个属性加平台特性:会错误地限制getter的平台范围,导致非Windows平台调用getter也触发警告:
[SupportedOSPlatform("windows")] public int WindowWidth { get => Console.WindowWidth; set => Console.WindowWidth = value; } if (!OperatingSystem.IsWindows()) { var width = WindowWidth; // 触发警告 }
- 仅给Setter加特性但未处理内部调用:编译通过但仍会触发内部
Console.WindowWidth.set的警告,因为编译器未识别到setter的平台限制会约束内部调用的上下文。
正确解决方案
方案1:给Setter单独标记平台特性
在.NET 6及以上版本中,可以直接给属性的setter单独添加SupportedOSPlatformAttribute。编译器会自动识别该setter的平台限制,同时不再警告内部对Console.WindowWidth.set的调用(因为setter本身已被标记为仅Windows,调用上下文是安全的):
using System.Runtime.Versioning; public class ConsoleWrapper { public int WindowWidth { get => Console.WindowWidth; [SupportedOSPlatform("windows")] set => Console.WindowWidth = value; } }
效果说明:
- 调用
WindowWidth(getter):全平台无警告 - 调用
WindowWidth = xxx(setter):非Windows平台代码会触发编译器警告,提示该成员仅支持Windows
如果仍存在内部调用警告,可以在setter内添加显式平台检查:
public int WindowWidth { get => Console.WindowWidth; [SupportedOSPlatform("windows")] set { if (!OperatingSystem.IsWindows()) { throw new PlatformNotSupportedException("WindowWidth setter仅支持Windows系统"); } Console.WindowWidth = value; } }
方案2:拆分Get和Set为独立成员
如果你的项目基于旧版.NET(不支持给get/set单独加特性),可以拆分为只读属性和独立的Set方法,明确区分平台支持范围:
using System.Runtime.Versioning; public class ConsoleWrapper { public int WindowWidth => Console.WindowWidth; [SupportedOSPlatform("windows")] public void SetWindowWidth(int width) { Console.WindowWidth = width; } }
内容的提问来源于stack exchange,提问作者devklick
相关产品推荐
相关产品推荐

