5

我创建了一个只能处理原始(或 ICloneable)类型的类

我想知道是否可以这样说:

 public myobject(primitiv original){...}

还是我真的需要为每个原始类型创建一个构造函数,例如:

 public myobject(int original){...}
 public myobject(bool original){...}
 ...

我想要实现的是创建一个具有 3 个公共属性 Value、Original 和 IsDirty 的对象。
该值将是原始的深层克隆,因此原始需要是原始的或 ICloneable

4

4 回答 4

6

如果您想这样做以强制使用您的 API 的任何人使用此类类型(如果他们使用错误的类型,则通过编译时错误),恐怕无法完成。

但是,您可以object在构造函数中接收 an ,评估其类型,并ArgumentException在参数既不是“原始”类型也不是 implements 的情况下抛出 an ICloneable

编辑:这可能很有用。您可以使用以下代码确定变量是否属于原始类型:

Type t = foo.GetType();
t.IsPrimitive; // so you don't have to do an evaluation for each primitive type.
于 2013-06-17T13:35:30.007 回答
6

C# 中的原始类型被定义为结构(通常ValueType在 .NET CLR 中实现)。我相信你有两个选择:

  1. 正如已经说过的:接收任何类型,检查每个可接受的类型,如果不匹配则抛出异常。
  2. 使您的类通用,使构造函数具有where T : structT作为类型参数)的约束。这将捕获所有结构,而不仅仅是原始类型,但我认为这是您希望在没有手动检查和编译时检查的情况下最好的结果。当然,您可以将此约束与其他约束混合使用。

您可以结合上面的两个选项,在编译时完成一些检查,而在运行时完成一些检查。

于 2013-06-17T13:51:18.063 回答
2

这不完全是您所要求的,但您可以有 2 个构造函数,一个用于结构,一个用于 ICloneable:

 public myobject(System.ValueType original){...}
 public myobject(ICloneable original){...}
于 2013-06-17T13:49:55.517 回答
-2

泛型而不是反射怎么样?

public class MyObject<T>
    where T: IComparable
{
    public MyObject(T original)
    {
        // do runtime check
    }
}


var c1 = new MyObject<int>(1);
// or
var c2 = new MyObject<Int32>(2);
于 2013-06-17T13:50:39.030 回答