首页 > 解决方案 > 使用另一种实现的 Baseproperty

问题描述

我有一个基类对话框:

public class Dialog<T> : IDialogAble<T> where T : class, IEntity
{
    public IEntityService<T, int> Service { get; set; }

    public async Task Suchen(Expression<Func<T, bool>> criteria)
    {
        Cursor = Cursors.Wait;
        await Service.Search(criterian);
        Cursor = Cursors.Arrow;
    }
}

在这个类中,我有一个在基类和派生类中使用的服务。我在构造函数中设置了服务:

Service = serviceFactory.CreateEntityService<MyObject, int>(context);

现在我有一个对象,我的服务必须实现 short not int,因为数据库上的主键是 tinyint。所以像这样:

Service = serviceFactory.CreateEntityService<MyObject, short>(context);

但这不起作用,因为在这种情况下 short 不能转换为 int 。问题是,这Dialog<T>不能更改为Dialog<T, TKey>. 我尝试使用 new 修饰符,但这不起作用,因为我在基类中使用了该服务:

public new IEntityService<OtherObject, short> Service { get; set; }

我没有找到解决方案,也许有人有想法。

标签: c#.net

解决方案


如果 的泛型参数IEntityService协变的,则可以使用IEntityService<T, object>.

您的课程将如下所示:

public class Dialog<T> : IDialogAble<T> where T : class, IEntity
{
    public IEntityService<T, object> Service { get; set; }

    public async Task Suchen(Expression<Func<T, bool>> criteria)
    {
        Cursor = Cursors.Wait;
        await Service.Search(criterian);
        Cursor = Cursors.Arrow;
    }
}

你仍然可以Service这样设置:

    Service = serviceFactory.CreateEntityService<MyObject, int>(context);

推荐阅读