不一致的可访问性:替代具有私有嵌套 class 的 public 实例

Inconsistent Accessibility: Alternative to having a public instance of a private nested class

据我所知,这种类型的构造不是常见的 C# 习惯用法,但我正在尝试尽可能接近地模拟现有 API 的接口。

我最初的想法是拥有一个 public 私有嵌套实例 class;但是,这会导致可访问性不一致的错误。这在某种程度上是有道理的,消费者需要查看 class 定义才能知道可以调用哪些方法。

我希望可以通过以下界面使用该库:

Web3 web3 = new Web3(new HttpProvider("hostname"));
string apiVersion = web3.Version.Api;
string transactionResponse = Web3.Eth.SendTransaction(transaction);

这种类型的界面与 Ruby 或 JavaScript 中的课程相同,只是很难弄清楚 C# 的等效项是什么。

部分嵌套 classes 将取决于 Web3 的特定实例化(它们取决于从连接到的特定 RPC 节点检索的信息)

我的第一个想法是:

public class Web3
{
    public readonly VersionInfo Version;
    private class VersionInfo
    {
        public readonly string Api = "2.0";
    }
}

当然,这给出了不一致的可访问性错误。

出于同样的原因,具有内部可见性的独立 class 不起作用。

有什么办法吗?创建一个用外部 class 实例化但不能自己实例化的 class?

一种方法是使 class 完全私有,return 一个接口:

private class VersionInfo : IVersionInfo
{
    public string Api { get { return "2.0"; } }
}

public interface IVersionInfo
{
    string Api { get; }
}

然后只需将 Web3 中的定义从 VersionInfo 更改为 IVersionInfo


或者,您可以这样做,这样 class 就不能**在库外实例化或扩展:

// Sealed to stop it being extended
public sealed class VersionInfo
{
    // Internal to stop it being instantiated outside the library
    internal VersionInfo()
    {
    }

    public readonly string Api = "2.0";
}

** 我说不能,但是有心人可以用反射创建实例。但是,这不是您可以阻止的事情。