c# - 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 答案的建议,但它对我不起作用,所以任何帮助都将不胜感激。
解决方案
有一个约束:
public abstract class Entity<T> : IEntity where T : struct
所以string
不是类型struct
,string
是引用类型。.NET 中的结构和类有什么区别?
约束通知编译器类型参数必须具有的功能。没有任何约束,类型参数可以是任何类型。编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。有关详细信息,请参阅为什么使用约束。
您可以删除此约束以避免此错误,现在您Id
可以是任何类型:
public abstract class Entity<T> : IEntity
作为 key 类型的替代方案string
,如果它符合您的情况,您可以创建T
type 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; }
推荐阅读
- backport - 运行 rackup : 要求 backports 已贬值
- r - 在 R 中找到比另一个值高三倍的值?
- java - 覆盖 Collections.sort()
- javascript - 单击图像并计算点击次数时如何使用 .addEventListener (Javascript)
- amazon-dynamodb - 我想增加在 dynamoDB 中使用 queryPage 读取的记录数
- python - 尝试读取图像中的单个值时出现 TypeError
- python - 在python中将xml数据转换为pandas数据框
- flutter - 如何像 Instagram 一样在自定义网格中播放视频
- java - GetMethod 中的 Java 反射枚举类型
- python - Gradient-Reversal-layer 在功能性 keras 模型中的实现以进行多分类