首页 > 解决方案 > C# 泛型错误 - 类型字符串必须不可为空

问题描述

我的其余 API 具有基于 .net core 3.0 的通用结构

这是我的通用实体代码。

public interface IFullAuditedEntity
{
    object Id { get; set; }
}

public abstract class FullAuditedEntity<T> : IFullAuditedEntity where T : struct
{
    public IFullAuditedEntity() { }

    [Key]
    public virtual T Id { get; set; }

    object Entity.Id
    {
        get { return Id; }
        set
        {
            Id = (T)value;
        }
    }
}

现在,如果我的实体有int primary key,这个结构对我来说很好。

但是如果我必须使用字符串作为主键,它会给我泛型错误。见下文实体。

[Table(name: "Status")]
public class Status : FullAuditedEntity<string>
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Required]
    [StringLength(03)]
    public override string Id { get; set; }

    [StringLength(03)]
    public string Type { get; set; }

}

有关更多信息,请参阅添加的快照。

在此处输入图像描述

我试图通过 Nullable 作为其他一些 SO 答案的建议,但它对我不起作用,所以任何帮助都将不胜感激。

标签: c#generics

解决方案


有一个约束:

public abstract class Entity<T> : IEntity where T : struct

所以string不是类型structstring是引用类型。.NET 中的结构和类有什么区别?

正如 msdn 所说:

约束通知编译器类型参数必须具有的功能。没有任何约束,类型参数可以是任何类型。编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。有关详细信息,请参阅为什么使用约束

您可以删除此约束以避免此错误,现在您Id可以是任何类型:

public abstract class Entity<T> : IEntity

作为 key 类型的替代方案string,如果它符合您的情况,您可以创建Ttype of Guid。如果它可以是 类型Guid,那么您可以避免删除约束:

public abstract class FullAuditedEntity<T> : IFullAuditedEntity where T : struct
{
     // ... The code is omitted for the brevity
}

和您的实体:

[Table(name: "Status")]
public class Status : FullAuditedEntity<string>
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Required]
    [Guid]
    public override Guid Id { get; set; }

推荐阅读