可访问性不一致:拥有私有嵌套类的公共实例的替代方案

时间:2018-07-03 02:07:57

标签: c# visibility api-design

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

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

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

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

这种类型的接口与Ruby或JavaScript中的课程相当,只是很难弄清楚C#的等效语言。

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

我实现该想法的第一个想法是:

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

当然,这会导致不一致的可访问性错误。

具有内部可见性的独立类由于相同的原因而无法正常工作。

有没有办法做到这一点?创建一个用外部类实例化的类,但不能单独实例化吗?

1 个答案:

答案 0 :(得分:2)

一种方法是将类完全私有,并返回一个接口:

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

public interface IVersionInfo
{
    string Api { get; }
}

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


或者,您也可以这样做,以使该类不能**在库外实例化或扩展:

// 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";
}

**我说不能,但是有决心的人可以使用反射创建实例。但是,这不是您可以避免的。