为什么我必须转换到界面?

时间:2014-05-21 18:38:24

标签: c# entity-framework inheritance interface

昨天,在处理一些实体框架时,我尝试写这个,并得到错误" ObjectContext不是会员"等

context.ObjectContext.Refresh(RefreshMode.StoreWins, myObject);

现在, context 继承了DbContext对象,在此处记录:http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx

这是""的正常继承。 type - 我的上下文对象是一个 DbContext 对象。 DbContext类实现 IObjectContextAdapter 接口,所以我希望上面的代码可以工作 - 接口声明的成员函数需要在DbContext类中实现,否则我会期望它失败使用"编译你必须实现接口"错误。但是,当我们查看生成的类定义时,它就不存在了!

最终,我实现了这样的调用,编译器接受了这个调用。

((IObjectContextAdapter)context).ObjectContext.Refresh(RefreshMode.StoreWins, myObject);

任何人都可以解释为什么我必须这样做,当下面的代码是相同的情况并且工作正常?

interface IMyInterface {
    int MyInterfaceMemberFunction();
}

public class MyObjectClass : IMyInterface {
    public int MyInterfaceMemberFunction() { return 17; }
}

public class MyTestClass {
    public int MyTestFunction() {
        MyObjectClass m = new MyObjectClass();
        return m.MyInterfaceMemberFunction(); //error here for EF context
    }
}

1 个答案:

答案 0 :(得分:1)

这是因为ObjectContext属性为explicitly implemented。要使用您的示例来演示它:

interface IMyInterface {
    int MyInterfaceMemberFunction();
}

public class MyObjectClass : IMyInterface {
    // this line changed:
    int IMyInterface.MyInterfaceMemberFunction() { return 17; }
}

public class MyTestClass {
    public int MyTestFunction() {
        MyObjectClass m = new MyObjectClass();
        //return m.MyInterfaceMemberFunction(); //error here
        return ((IMyInterface)m).MyInterfaceMemberFunction(); //this works
    }
}

如果您有两个定义具有相同名称的不同成员的接口,则必须进行显式实现。它也可以用来隐藏某些界面成员,如果你希望它们不被正常使用你的班级的人注意到。例如,List<T>实现了IList,但是明确地实现了IList.Add(object),这样您就不会意外地尝试向T添加除List<T>之外的任何内容。