gpt4 book ai didi

c# - 接口(interface)如何公开实现类中不存在的公共(public)属性/方法?

转载 作者:太空狗 更新时间:2023-10-30 01:04:42 26 4
gpt4 key购买 nike

问题简而言之:公共(public)类 DbContext:IDisposable,IObjectContextAdapter

DbContext 实现了 IObjectContextAdapter。 IObjectContextAdapter 有一个属性,

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

但是,我在 DbContext 中找不到这个属性;元数据代码中不存在它很简单。访问它的唯一方法是将 DbContext 转换为 IObjectContextAdapter。

我不明白 - 我会认为接口(interface)的公共(public)属性由实现类公开,无论是否强制转换为接口(interface)。我觉得我在这里错过了一些重要的东西......

最佳答案

这意味着DbContext 显式实现了该属性,如下所示:

public class DbContext : IObjectContextAdapter
{
ObjectContext IObjectContextAdapter.ObjectContext { get { ... }}
}

显式实现成员时,必须将实例转换为其接口(interface)才能访问。

这种技术通常用于实现具有相同签名的两个成员。例如,在执行 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

关于c# - 接口(interface)如何公开实现类中不存在的公共(public)属性/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22194230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com