接口如何公开实现类中不存在的公共属性/方法?

时间:2014-03-05 09:55:59

标签: c# .net entity-framework interface

简而言之: public class DbContext:IDisposable,IObjectContextAdapter

DbContext实现IObjectContextAdapter。 IObjectContextAdapter有一个属性

public interface IObjectContextAdapter
{
    // Summary:
    //     Gets the object context.
    ObjectContext ObjectContext { get; }
}

但是,我在DbContext中找不到这个属性;元数据代码中没有它很简单。只有这样才能访问它,就是将DbContext强制转换为IObjectContextAdapter。

我不明白 - 我会认为接口的公共属性是由实现类公开的,无论是否被强制转换为接口。我觉得我在这里错过了一些大事......

2 个答案:

答案 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

请参阅:MSDN Explicit Interface Implementation

答案 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();
相关问题