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

我的应用程序使用了不同“类型”的几个“句柄”(所有IntPtr).

我想帮助确保将正确的句柄类型传递给我的各种方法…如果我使用IntPtr,则没有提示该方法采用句柄类型A或句柄类型B.

如果L在C land中我可以使用typedef:

typedef uint32 HdlA;
typedef uint32 HdlB;

现在我有两种类型,HdlA和HdlB,两者都是通用U32的引擎盖.
在C中我还可以使用宏来声明结构.

另外,出于编组的原因,我需要将它们作为值类型…不能使用类(当然,如果我可以使用可以解决所有问题的类).

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

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个相同的代码块,其中只有结构名称变化 – 但这不是很优雅.

我考虑过使用一个接口,但不允许成员字段,所以没有运气.

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

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

有任何想法吗?

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

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

点赞