为什么我不能直接拨打DbContext.ObjectContext
?我可以这样做((IObjectContextAdapter)context).ObjectContext
我认为内部机制是像这样
的隐式实现接口class Program
{
static void Main(string[] args)
{
TestClass t = new TestClass();
((TestInterface)t).TestMethod();
// I can't call t.TestMethod()
Console.ReadKey();
}
}
public interface TestInterface
{
void TestMethod();
}
public class TestClass : TestInterface
{
void TestInterface.TestMethod()
{
Console.WriteLine("abcdefg");
}
}
我遇到此问题之前IEnumerable<T>
继承IEnumerable
,它具有通用版本IEnumerator<T> GetEnumerator()
和非通用版本IEnumerator GetEnumerator()
,但您只能调用通用一个而不是非一般的。这是因为非泛型的不是类型安全的,作者想隐藏它。
但是DbContext类的原因是什么?
答案 0 :(得分:5)
因为ObjectContext是在DbContext类中显式实现的(如MSDN - DbContext所示),所以你必须将对象显式地转换为接口来调用属性。
“当显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问它。” - MSDN - Explicit Interface Implementation Tutorial
希望这有帮助!
答案 1 :(得分:1)
我怀疑,因为ObjectContext
已弃用DbContext
。 DbContext
是一个比ObjectContext
更令人愉快的API。
答案 2 :(得分:0)
如果检查Codeplex上可用的DbContext类的源代码,则显式实现ObjectContext属性。以下是源代码(我删除了注释):
ObjectContext IObjectContextAdapter.ObjectContext
{
get
{
InternalContext.ForceOSpaceLoadingForKnownEntityTypes();
return InternalContext.ObjectContext;
}
}
这就是为什么你不能使用DbContext的对象调用属性ObjectContext而不将其转换为IObjectContextAdapter类型的原因。