简而言之: public class DbContext:IDisposable,IObjectContextAdapter
DbContext实现IObjectContextAdapter。 IObjectContextAdapter有一个属性
public interface IObjectContextAdapter
{
// Summary:
// Gets the object context.
ObjectContext ObjectContext { get; }
}
但是,我在DbContext中找不到这个属性;元数据代码中没有它很简单。只有这样才能访问它,就是将DbContext强制转换为IObjectContextAdapter。
我不明白 - 我会认为接口的公共属性是由实现类公开的,无论是否被强制转换为接口。我觉得我在这里错过了一些大事......
答案 0 :(得分:4)
这意味着DbContext
明确地实现了属性,如下所示:
public class DbContext : IObjectContextAdapter
{
ObjectContext IObjectContextAdapter.ObjectContext { get { ... }}
}
当显式实现成员时,必须将实例转换为其接口才能访问。
此技术通常可用于实现具有相同签名的两个成员。例如,在实施IEnumerable<T>
时,您必须实现两个成员:
IEnumerator GetEnumerator
的IEnumerable
来自IEnumerator<T> GetEnumerator
IEnumerable<T>
其中一个有明确实施:
public class X : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
.NET框架中的某些类使用它来隐藏或阻止某些成员的使用。 ConcurrentQueue<T>
不鼓励使用IProducerConsumerCollection.TryAdd
并鼓励使用ConcurrentQueue<T>.Enqueue
。
答案 1 :(得分:1)
您所看到的是显式接口实现,请参阅下文
interface IExplicit
{
void Explicit();
}
class Something : IExplicit
{
void IExplicit.Explicit()
{
}
}
所以,我们可以实例化一个new Something()
,但要访问我们必须转换类型的IExplicit
实现。
var something = new Something();
// Compile time error.
something.Explicit();
// But we can do.
((IExplicit)something).Explicit();