C# 使用其他类型的已实现Baseproperty

C# 使用其他类型的已实现Baseproperty,c#,.net,C#,.net,我有一个基类对话框: 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

我有一个基类对话框:

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;
    }
}
public类对话框:IDialogAble,其中T:class,IEntity
{
公共IEntityService服务{get;set;}
公共异步任务Suchen(表达式条件)
{
游标=游标。等等;
等待服务。搜索(标准);
游标=游标。箭头;
}
}
在这个类中,我有一个在基类和派生类中使用的服务。 我在构造函数中设置了服务:

Service = serviceFactory.CreateEntityService<MyObject, int>(context);
Service=serviceFactory.CreateEntityService(上下文);
现在我有了一个对象,我的服务必须在其中实现short not int,因为数据库上的主键是tinyint。所以像这样:

Service = serviceFactory.CreateEntityService<MyObject, short>(context);
Service=serviceFactory.CreateEntityService(上下文);
但这不起作用,因为在这种情况下short不能转换为int。问题是,
Dialog
无法更改为
Dialog
。 我尝试使用新的修饰符,但这不起作用,因为我在基类中使用服务:

public new IEntityService<OtherObject, short> Service { get; set; }
public-new-IEntityService服务{get;set;}
我没有找到解决办法,也许有人有主意。

简单:

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

    public async Task Suchen(Expression<Func<T, bool>> criteria)
    {
        Cursor = Cursors.Wait;
        await Service.Search(criterian);
        Cursor = Cursors.Arrow;
    }
}
public类对话框:IDialogAble,其中T:class,IEntity
{
公共IEntityService服务{get;set;}
公共异步任务Suchen(表达式条件)
{
游标=游标。等等;
等待服务。搜索(标准);
游标=游标。箭头;
}
}
没有其他方法可以实现这一目标。 但是

你所做的事情有点不对劲。 首先,数据库中的所有键都应该是相同类型的。您不应该将INT类型的键指定给一个表,而将short类型的键指定给另一个表。它们应该是同一类型的

不要害怕使用int作为键,甚至BIGINT(Int64,UInt64)。它们非常适合这个紫色的房子


我敢打赌,您的一个表是某种字典表,它只有几个记录,因此使用short作为键。但是不要这样做。

如果
IEntityService
的通用参数为,您可以使用
IEntityService

然后,您的类将如下所示:

Service = serviceFactory.CreateEntityService<MyObject, short>(context);
public类对话框:IDialogAble,其中T:class,IEntity
{
公共IEntityService服务{get;set;}
公共异步任务Suchen(表达式条件)
{
游标=游标。等等;
等待服务。搜索(标准);
游标=游标。箭头;
}
}
您仍然可以这样设置
服务

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

您不应该将INT类型的键指定给一个表,而将short类型的键指定给另一个表
为什么不呢?这是一个非常合理的情况。数据库中的键不一定是同一类型的。你的意见毫无根据。例如,一些实体可能需要GUID/UUID,而其他实体则可以是序号。谢谢。问题是db被使用了很长一段时间,改变了很多人。这些表有很多关系,因此我无法轻松更改主键的类型。对于您答案的第一部分,这就是问题的答案。据我所知,不同表具有不同类型的主键将对连接或索引操作产生性能影响。更重要的是,索引的最佳候选者是integer(当它不是int时,也会对性能产生相同的影响,但在大多数情况下可能会被忽略),而且,这可能会给处理此类代码带来一些额外的困难。您必须在get/set中添加将int转换为short的功能。类似这样的东西:private-IEntityService{u-Service{get;set;}public-IEntityService服务{get{返回新的IEntityService(T,(byte)(_-Service.Value&0xFF));}set{u-Service=new-IEntityService(Test,Value.Value);}我必须在派生类中设置服务,所以我不能使用这样的功能。您在派生类中有一个get/set,因此没有理由在get/set中添加功能。我不明白您的意思。我不想设置值,我想设置服务。或者我不明白您的想法吗?下面一行的get/set可以包含代码:publicientityservice服务{get;set;}。请参阅下面的回答25:这不起作用,因为在这种情况下int/short无法转换为object。@Presi是接口
IEntityService
或类似的东西?接口是
IEntityService