我的应用程序使用了不同“类型”的几个“句柄”(所有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字段可以解决问题.
然后,您可以检查每个方法中的该字段,以查看是否已传递正确的结构.