如何告诉构造函数它应该只使用原始类型

时间:2013-06-17 13:30:25

标签: c# types .net-4.0 overloading

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

的类

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

 public myobject(primitiv original){...}

或者我真的需要为每个基本类型创建一个构造函数,如:

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

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

4 个答案:

答案 0 :(得分:6)

如果你想这样做是为了强迫任何人使用你的API来使用这些类型(通过编译时错误,如果他们使用了错误的类型),我担心它无法完成。

但是,您可以在构造函数中接收object,评估其类型,并抛出ArgumentException,以防参数既不是“原始”类型也不是实现{{1} }。

修改:这可能很有用。您可以使用以下代码确定变量是否属于基本类型:

ICloneable

答案 1 :(得分:6)

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

  1. 如前所述:接收任何类型,针对每种可接受的类型进行检查,如果不匹配则抛出异常。
  2. 使您的类具有通用性,使用where T : struct的约束(其中T为类型参数)使构造函数通用。这将捕获所有结构,而不仅仅是原始类型,但我认为没有手动检查和编译时检查,这是您可以期望的最佳结果。当然,您可以将此约束与其他约束混合使用。
  3. 你可以结合上面的两个选项,让一些检查在编译时完成,其中一些在运行时完成。

答案 2 :(得分:2)

这不完全是你问的,但你可以有2个构造函数,一个用于结构,一个用于ICloneable:

 public myobject(System.ValueType original){...}
 public myobject(ICloneable original){...}

答案 3 :(得分:-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);