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

时间:2015-11-13 21:02:28

标签: c# asp.net-mvc entity-framework interface generic-programming

我在.NET MVC中使用实体框架和C#。我为POCO创建了一个界面,我想跟踪他们的变化(基于POCO的自定义逻辑,而不是EF已经做过的事情)。界面:

public interface ITrackChangesService<TClass>
    {
        void SaveChanges(TClass entity);
    }

我试图在我的EntitySevice中使用它,所有POCO服务都继承自,EntityService的声明:

 public abstract class EntityService<TRepositoryClass, TClass, TDbContext>
    where TClass : Entity, new()
    where TDbContext : DbContext, new()
    where TRepositoryClass : EntityRepository<TClass, TDbContext>, new()
{

正如我的评论所示,我正在尝试检查从子类(如UserService)调用Save的时间:

public class UserService : EntityService<UserRepository, User, MyDbContext>, ITrackChangesService<User>

要查看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);
            }
        }
    }

但是我似乎无法从调用子类调用SaveChanges方法。 .SaveChanges无法识别。如何让它得到认可。

1 个答案:

答案 0 :(得分:4)

您投放的返回值为this.SaveChanges(),而不是this

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