不一致的可访问性:替代具有私有嵌套 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";
}
** 我说不能,但是有心人可以用反射创建实例。但是,这不是您可以阻止的事情。
据我所知,这种类型的构造不是常见的 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";
}
** 我说不能,但是有心人可以用反射创建实例。但是,这不是您可以阻止的事情。