我正在写一个通用的DataStructure<T>并保留在磁盘上,因此我需要对其进行编写,以确保T可以序列化为固定的字节数。例如,应接受intchar,但不应接受stringint[]。同样,带有struct成员的string是 Not Acceptable ,但是带有unsafe struct数组的fixed char是可接受的。

我可以使用反射和sizeof在初始化程序中编写运行时测试,以测试每个成员,但这似乎是一个可怕的技巧。是否有任何有效(相对)安全的方法来执行此操作?

最佳答案

无法静态支持仅具有固定特定大小的通用参数。约束仅限于接口(interface),ref/struct,基类和new

但是,您可以做的是使用静态工厂方法将泛型的使用限制为合适的已知有限类型集。例如

class DataStructure<T> {
  private DataStructure(T value) {
    ...
  }
}
static class DataStructure {
  public static DataStructure<int> Create(int i) {
    return new DataStructure<int>(i);
  }
  public static DataStructure<char> Create(char c) {
    return new DataStructure<char>(c);
  }
}

但这是有限制的,因为它要求您提前列出所有可比较的类型。如果您想要一种更灵活的解决方案来与用户定义的类型一起使用,则需要实现运行时检查。
public static DataStructure<T> Create<T>(T value) {
  RuntimeVerification(typeof(T));
  return new DataStructure<T>(value);
}

10-02 15:10