2012-10-26 32 views
2

爲什麼我不能直接撥打DbContext.ObjectContext?我能做到這一點((IObjectContextAdapter)context).ObjectContext爲什麼我不能直接調用DbContext.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

如果您想將IEnumerable轉換爲IEnumerable 您需要撥打電話或者電話。 – Pawel

回答

1

我懷疑自ObjectContext已被棄用,贊成DbContextDbContext是比ObjectContext更令人愉快的API。

+1

我不會說ObjectContex已被棄用,但最好使用DbContext,因爲它更容易使用。由於DbContext建立在ObjectContext之上,並且有些事情你不能用DbContext做,所以接口允許獲得ObjectContext實例來實現這些事情 – Pawel

5

由於ObjectContext在DbContext類中顯式實現(如MSDN - DbContext所示),因此必須將對象顯式轉換爲接口以調用Property。

「當一個成員被顯式實現,它不能通過類實例訪問,而只能通過接口的實例。」 - MSDN - Explicit Interface Implementation Tutorial

希望這有助於!

0

如果您檢查Codeplex上可用的DbContext類的源代碼,則顯式實現ObjectContext屬性。這裏是一塊從源代碼(我已刪除評論):

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

這就是爲什麼你就不能調用使用的DbContext的一個對象的屬性的ObjectContext沒有它鑄造IObjectContextAdapter的原因類型。

相關問題