2

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>which is inheritsの前にこの問題に遭遇しIEnumerableました。これにはジェネリック バージョンIEnumerator<T> GetEnumerator()と非ジェネリック バージョンがありますが、非ジェネリック バージョンIEnumerator GetEnumerator()ではなくジェネリック バージョンしか呼び出すことができません。これは、非ジェネリックなものがタイプ セーフではなく、作成者がそれを非表示にしたいためです。

しかし、 DbContextクラスの理由は何でしょうか?

4

3 に答える 3

5

ObjectContextはDbContextクラスに明示的に実装されているため(MSDN-DbContextに示されているように)、プロパティを呼び出すには、オブジェクトをインターフェイスに明示的にキャストする必要があります。

「メンバーが明示的に実装されている場合、クラスインスタンスを介してアクセスすることはできませんが、インターフェイスのインスタンスを介してのみアクセスできます。」- MSDN-明示的なインターフェイス実装チュートリアル

お役に立てれば!

于 2012-10-26T15:15:13.513 に答える
1

ObjectContextを支持して廃止されたので、私は疑うでしょうDbContextDbContextよりもはるかに快適な API ですObjectContext

于 2012-10-26T15:08:44.443 に答える
0

Codeplexで公開されている DbContext クラスのソース コードを確認すると、プロパティ ObjectContext が明示的に実装されています。ソースからのコードは次のとおりです (コメントは削除しました)。

ObjectContext IObjectContextAdapter.ObjectContext
        {
            get
            {
                InternalContext.ForceOSpaceLoadingForKnownEntityTypes();
                return InternalContext.ObjectContext;
            }
        }

これが、IObjectContextAdapter 型にキャストせずに DbContext のオブジェクトを使用してプロパティ ObjectContext を呼び出すことができない理由です。

于 2012-10-26T15:33:27.087 に答える