我的应用程序使用了多个不同“类型”的“句柄”(都是 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/