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

.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+,可启用可空引用类型,同时通过泛型约束区分值类型和引用类型的处理:

  1. 在项目的.csproj文件中添加配置:
<PropertyGroup>
  <Nullable>enable</Nullable>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>
  1. 定义重载接口以适配不同类型:
// 针对值类型用户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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:05:59