C#泛型错误-类型字符串必须不可为空

时间:2019-11-18 07:30:31

标签: c# generics

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

这是我的通用实体代码。

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主键,则此结构对我来说很好。

但是如果我必须使用 string作为主键,它会给我泛型错误。参见下面的实体。

[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; }

}

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

enter image description here

我尝试通过Nullable,如其他一些SO答案所建议的那样,但这对我不起作用,因此,我们将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:4)

有一个约束条件:

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

所以string不是struct的类型,string是引用类型。 What's the difference between struct and class in .NET?

As msdn says:

  

约束将类型参数的功能告知编译器   一定有。没有任何约束,类型参数可以是任何   类型。编译器只能假定System.Object的成员,   是任何.NET类型的最终基类。了解更多信息,   参见Why use constraints

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

public abstract class Entity<T> : IEntity

作为string类型密钥的替代方法,如果它适合您的情况,则可以创建T类型的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; }