c# - 如何在 C# 的通用抽象类中定义类型 T 必须具有字段 “ID”

标签 c# generics

我正在尝试创建一个通用类,它允许我保存/删除客户、产品,这样我就可以在一个地方完成所有基本实现。

public class Product : ItemDataService<Product>
{
public int id {get; set;}
}

public class Customer : ItemDataService<Customer>
{
public int id {get; set;}
}

public abstract class ItemDataService<T, V>
{
public T Item { get; set; }

public int Id { get; set; }

public ItemDataService(T item)
{
    Item = item;
}

public void SaveItem(T item)
{
    if (Item.Id <= 0)
    {
        InsertItem(item);
    }
}
}

我如何访问 Id customer的属性(property)在 ItemDataService 中上课类,这样我就可以检查Item.Id <= 0

最佳答案

定义接口(interface)ISomeInterface有一个字段 Id ,比如:

public interface ISomeInterface
{
    int Id { get; }
}

然后您可以让您的抽象类实现该接口(interface),并添加一个需要 T 的通用约束。成为该接口(interface)的实现,如下所示:

public abstract class ItemDataService<T> : ISomeInterface
    where T : ISomeInterface
{
    public int Id { get; set; }

    // ...

    public void SaveItem(T item)
    {
        if (Item.Id <= 0) // Id is accessible now..
        {
            InsertItem(item);
        }
    }
}

编辑

实际上,鉴于您有趣的继承树,您根本不需要接口(interface)。您可以简单地添加一个强制执行 T 的通用约束。成为 ItemDataService<T> 的 child .它看起来很有趣,但它确实有效:

public abstract class ItemDataService<T>
    where T : ItemDataService<T>
{
    public int Id { get; set; }

    // ...

    public void SaveItem(T item)
    {
        if (Item.Id <= 0) // Id is accessible now..
        {
            InsertItem(item);
        }
    }
}

关于c# - 如何在 C# 的通用抽象类中定义类型 T 必须具有字段 “ID”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37489793/

相关文章:

kotlin - 具有方差的参数化数据类

c# - DataView 行过滤

c# - 使用 Mocks 验证依赖调用时的 TDD Arrange Act Assert 模式

c# - 在 Entity Framework 中添加 AsNoTracking 会影响计数吗?

c# - 如何分割在 foreach 循环中迭代的元素

c# - 在依赖于同一类其他属性的属性中强制执行适当值的公认方法是什么?

c# - 检查指定类型是否匹配泛型类型?

c# - 如何制作通用类型转换函数

delphi - 检查对象是否继承自泛型类

c# - 将通用类型对象转换为子类型