C# 检查';这';实现一个接口,然后从子类的泛型基类内部调用其成员?

C# 检查';这';实现一个接口,然后从子类的泛型基类内部调用其成员?,c#,asp.net-mvc,entity-framework,interface,generic-programming,C#,Asp.net Mvc,Entity Framework,Interface,Generic Programming,我正在使用.NETMVC中的实体框架和C#。我已经为我想要跟踪其更改的POCO创建了一个接口(基于POCO的自定义逻辑,而不是EF已经可以做的)。界面: public interface ITrackChangesService<TClass> { void SaveChanges(TClass entity); } 公共接口ITrackChangesService { 作废保存更改(TClass实体); } 我正试图在我的EntitySevice

我正在使用.NETMVC中的实体框架和C#。我已经为我想要跟踪其更改的POCO创建了一个接口(基于POCO的自定义逻辑,而不是EF已经可以做的)。界面:

public interface ITrackChangesService<TClass>
    {
        void SaveChanges(TClass entity);
    }
公共接口ITrackChangesService
{
作废保存更改(TClass实体);
}
我正试图在我的EntitySevice(所有POCO服务均从其继承)中使用该声明,EntityService声明:

 public abstract class EntityService<TRepositoryClass, TClass, TDbContext>
    where TClass : Entity, new()
    where TDbContext : DbContext, new()
    where TRepositoryClass : EntityRepository<TClass, TDbContext>, new()
{
公共抽象类EntityService
其中TClass:Entity,new()
其中TDbContext:DbContext,new()
其中TRepositoryClass:EntityRepository,new()
{
正如我的评论所示,我试图检查当从UserService这样的子类调用Save时:

public class UserService : EntityService<UserRepository, User, MyDbContext>, ITrackChangesService<User>
公共类用户服务:EntityService,ITrackChangesService
要查看UserService是否实现了ITrackChangesService,如果实现了,请对其调用SaveChanges方法。这是在实体服务中的我的Save方法中完成的:

public virtual void Save(TClass entity)
    {
        if (entity != null)
        {
            entity.LastModifiedBy = SessionUtil.UserAbsolute == null ? "System" : SessionUtil.UserAbsolute.NetId;

            if (Exists(entity))
            {
                entity.DateModified = DateTime.Now;
                //if(this is ITrackChangesService<TClass>)
                //{
                //    (ITrackChangesService<TClass>) this.SaveChanges(entity);
                //}
                Repository.Update(entity);
            }
            else
            {
                entity.CreatedBy = SessionUtil.UserAbsolute == null ? "System" : SessionUtil.UserAbsolute.NetId;
                entity.DateCreated = DateTime.Now;
                Repository.Insert(entity);
            }
        }
    }
公共虚拟作废保存(TClass实体)
{
如果(实体!=null)
{
entity.LastModifiedBy=SessionUtil.UserAbsolute==null?“系统”:SessionUtil.UserAbsolute.NetId;
如果(存在(实体))
{
entity.DateModified=DateTime.Now;
//如果(这是ITrackChangesService)
//{
//(ITrackChangesService)此.SaveChanges(实体);
//}
更新(实体);
}
其他的
{
entity.CreatedBy=SessionUtil.UserAbsolute==null?“系统”:SessionUtil.UserAbsolute.NetId;
entity.DateCreated=DateTime.Now;
储存库。插入(实体);
}
}
}

但是,我似乎无法从调用子类调用SaveChanges方法。
.SaveChanges
无法识别。如何才能识别它。

您正在强制转换
this.SaveChanges()
的返回值,而不是
this

var trackChangesService = this as ITrackChangesService<TClass>;
if(trackChangesService != null)
{
    trackChangesService.SaveChanges(entity);
}
var trackChangesService=这是ITrackChangesService;
if(trackChangesService!=null)
{
trackChangesService.SaveChanges(实体);
}

您正在强制转换
this.SaveChanges()
的返回值,而不是
this

var trackChangesService = this as ITrackChangesService<TClass>;
if(trackChangesService != null)
{
    trackChangesService.SaveChanges(entity);
}
var trackChangesService=这是ITrackChangesService;
if(trackChangesService!=null)
{
trackChangesService.SaveChanges(实体);
}

BTW不相关,但使用
DateTime。现在当涉及数据库时,使用
UtcNow
而不是
UtcNow几乎总是一个坏主意。实际上(除了@IanMercer所说的之外),您可能希望将
DateTime.UtcNow
包装为可注入类型,以便可以在任何日期测试您的日期逻辑(通过注入真实日期/时间或注入特定的假日期)。顺便说一句,不相关,但使用
DateTime。现在
而不是
UtcNow
在数据库方面几乎总是一个坏主意。实际上(除了@IanMercer所说的)您可能希望将
DateTime.UtcNow
包装为可注入类型,以便可以在任何日期测试日期逻辑(通过注入真实日期/时间或注入特定假日期)。或者您可以执行
((ITrackChangesService)此操作)。保存更改(实体)
谢谢,这不会导致
this的实例出现任何问题,是吗?在自身内部放置对自身的引用感觉很奇怪。不,它不会产生任何问题。或者您可以执行
((ITrackChangesService)this)。保存更改(实体)
谢谢,这不会导致
this的实例出现任何问题,是吗?将自身引用放在自身内部感觉很奇怪。不,它不会产生任何问题。