我创建了一个只能处理原始(或ICloneable)类型
的类我想知道是否可以这样说:
public myobject(primitiv original){...}
或者我真的需要为每个基本类型创建一个构造函数,如:
public myobject(int original){...}
public myobject(bool original){...}
...
我想要实现的是创建一个具有3个公共属性Value,Original和IsDirty的对象。
该值将是一个深刻的原始克隆,因此原始需要是原始的或ICloneable
答案 0 :(得分:6)
如果你想这样做是为了强迫任何人使用你的API来使用这些类型(通过编译时错误,如果他们使用了错误的类型),我担心它无法完成。
但是,您可以在构造函数中接收object
,评估其类型,并抛出ArgumentException
,以防参数既不是“原始”类型也不是实现{{1} }。
修改:这可能很有用。您可以使用以下代码确定变量是否属于基本类型:
ICloneable
答案 1 :(得分:6)
C#中的原始类型被定义为结构(在.NET CLR中通常实现为ValueType
)。我相信你有两个选择:
where T : struct
的约束(其中T
为类型参数)使构造函数通用。这将捕获所有结构,而不仅仅是原始类型,但我认为没有手动检查和编译时检查,这是您可以期望的最佳结果。当然,您可以将此约束与其他约束混合使用。你可以结合上面的两个选项,让一些检查在编译时完成,其中一些在运行时完成。
答案 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);