C#:如何声明多个相似的结构?

标签 c# struct

我的应用程序使用了多个不同“类型”的“句柄”(都是 IntPtr 的)。

我想帮助确保将正确的句柄类型传递给我的各种方法...如果我对它们全部使用 IntPtr,则不会提示该方法采用句柄类型 A 或句柄类型 B。

如果 L 在 C++ 领域,我可以使用 typedefs:

typedef uint32 HdlA;
typedef uint32 HdlB;

现在我有两种类型,HdlA 和 HdlB,它们都是通用的 U32。 在 C++ 中,我还可以使用宏来声明结构。

此外,出于编码(marshal)处理的原因,我需要这些是值类型...不能使用类(当然,如果我可以使用可以解决所有问题的类)。

所有句柄具有基本相同的定义:

public struct HdlA
{
    private IntPtr _h;
    public bool IsValid             get { return (_h != IntPtr.Zero);} }
    //public HdlA()                 { _h = IntPtr.Zero; } // C# disallows arg-less ctor on struct
    public HdlA(IntPtr h)           { _h = h; }
    public void Invalidate()        { _h = IntPtr.Zero; }
    public static implicit operator IntPtr(HdlA hdl)  { return hdl._h; }
}
public struct HdlB
{
    private IntPtr _h;
    public bool IsValid             get { return (_h != IntPtr.Zero);} }
    //public HdlB()                 { _h = IntPtr.Zero; } // C# disallows arg-less ctor on struct
    public HdlB(IntPtr h)           { _h = h; }
    public void Invalidate()        { _h = IntPtr.Zero; }
    public static implicit operator IntPtr(HdlB hdl)  { return hdl._h; }
}
... etc ...

我当然可以手写 - 我可以声明 5 或 6 个相同的代码块,其中只有结构名称不同 - 但这不是很优雅。

我考虑过使用接口(interface),但它不允许成员字段,所以运气不好。

我喜欢的是拥有一个基础结构,然后让 HdlA、HdlB 等简单地从基础派生。但是 C# 不允许在结构中使用基类型。

这似乎应该有一个简单而优雅的解决方案,但它正在逃避我:(

有什么想法吗?

最佳答案

一种解决方案是只使用一个包含所有公共(public)字段的结构,并添加一个显示您要使用的结构类型的字段(int 或 Enum)。当然,如果您能够使用类,您会使用继承,但在这种情况下,添加 HandleType 字段可能会解决问题。

然后您可以在每个方法中检查该字段以查看是否传递了正确的结构。

关于C#:如何声明多个相似的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23816468/

相关文章:

c++ - 结构数组成员的默认值

c# - 将 ObservableCollection 绑定(bind)到 WPF 中的 ComboBox

c# - .NET HttpListener - 设置浏览器代理时监听 "https://*.8080"时没有流量?

C - 无法从 void 指针访问结构元素值

c++ - 引用结构大小的更好方法(#pragma pack VS 定义的大小)

c - 奇怪的 Char* 截断

c# - 网络套接字帮助!

c# - 对 asp.net 页面进行 jquery ajax 调用

c# - 在配置中找不到指定的命名连接,不打算与 EntityClient 提供程序一起使用,或者无效

c - 如何使用#define 访问c 中的struct 成员