.NET 8 C#中如何创建支持可空Get属性的泛型审计接口
解决泛型审计接口未完全实现的问题
问题分析
你定义的泛型审计接口属性看似匹配,但编译器提示未完全实现,核心原因是泛型可空类型在值类型(如int)和引用类型(如string/Guid)上的处理差异,以及编译器对隐式实现的属性匹配校验严格性导致的歧义。
解决方案
方案1:显式实现接口
显式实现接口可强制属性类型完全匹配,消除编译器歧义提示,同时保留类内部的访问修饰符约束:
using System; public interface IAuditedEntity<UserIdType> { UserIdType CreatedBy { get; } DateTime DateCreated { get; } UserIdType? ModifiedBy { get; } DateTime? DateModified { get; } UserIdType? DeletedBy { get; } DateTime? DateDeleted { get; } } public class AuditedClass : IAuditedEntity<int> { public int Id { get; protected set; } // 显式实现接口的所有属性 int IAuditedEntity<int>.CreatedBy => CreatedBy; DateTime IAuditedEntity<int>.DateCreated => DateCreated; int? IAuditedEntity<int>.ModifiedBy => ModifiedBy; DateTime? IAuditedEntity<int>.DateModified => DateModified; int? IAuditedEntity<int>.DeletedBy => DeletedBy; DateTime? IAuditedEntity<int>.DateDeleted => DateDeleted; // 类的公共属性,保留protected set约束 public int CreatedBy { get; protected set; } public DateTime DateCreated { get; set; } public int? ModifiedBy { get; protected set; } public DateTime? DateModified { get; protected set; } public int? DeletedBy { get; protected set; } public DateTime? DateDeleted { get; protected set; } }
方案2:启用可空引用类型并优化接口约束
如果项目使用C# 8.0+,可启用可空引用类型,同时通过泛型约束区分值类型和引用类型的处理:
- 在项目的
.csproj文件中添加配置:
<PropertyGroup> <Nullable>enable</Nullable> <LangVersion>8.0</LangVersion> </PropertyGroup>
- 定义重载接口以适配不同类型:
// 针对值类型用户ID public interface IAuditedEntity<T> where T : struct { T CreatedBy { get; } DateTime DateCreated { get; } T? ModifiedBy { get; } DateTime? DateModified { get; } T? DeletedBy { get; } DateTime? DateDeleted { get; } } // 针对引用类型用户ID public interface IAuditedEntity<T> where T : class { T CreatedBy { get; } DateTime DateCreated { get; } T? ModifiedBy { get; } DateTime? DateModified { get; } T? DeletedBy { get; } DateTime? DateDeleted { get; } } // 实现值类型版本 public class AuditedClass : IAuditedEntity<int> { public int Id { get; protected set; } public int CreatedBy { get; protected set; } public DateTime DateCreated { get; set; } public int? ModifiedBy { get; protected set; } public DateTime? DateModified { get; protected set; } public int? DeletedBy { get; protected set; } public DateTime? DateDeleted { get; protected set; } }
关键说明
- 显式实现接口是最直接解决当前编译器提示的方式,无需调整项目配置。
- 启用可空引用类型能让编译器更准确校验可空类型匹配,同时提升代码安全性。
内容的提问来源于stack exchange,提问作者Victor Jackson
相关产品推荐
相关产品推荐

