给定构造函数
public MyObject(int id){
ID = id;
}
两个枚举:
public enum MyEnum1{
Something = 1,
Anotherthing = 2
}
public enum MyEnum2{
Dodo = 1,
Moustache= 2
}
是否可以传入通用枚举作为构造函数的参数?我正在寻找一个解决方案:
public MyObject(enum someEnum){
ID = (int)someEnum;
}
所以你可以这样做:
var newObject = new MyObject(MyEnum1.Something);
var anotherObject = new MyObject(MyEnum2.Dodo);
答案 0 :(得分:6)
另一种选择是:
public MyObject(Enum someEnum){
ID = Convert.ToInt32(someEnum);
}
通过这种方式,您可以按照自己的要求使用它,而无需在每次打电话给你的contstructors时投射到int
:
var newObject = new MyObject(MyEnum1.Something);
var anotherObject = new MyObject(MyEnum2.Dodo);
答案 1 :(得分:5)
只需使用通用构造函数:
<script>
现在您可以轻松地将其称为:
class MyObject<T> {
public MyObject(T someEnum) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("Not an enum");
ID = Convert.ToInt32(someEnum);
}
}
但更容易将枚举作为整数传递给构造函数,如其他答案所述。
答案 2 :(得分:4)
为什么要传递枚举,而你可以传递整数?
var newObject = new MyObject((int)MyEnum1.Something);
var anotherObject = new MyObject((int)MyEnum2.Dodo);
并使用您的第一个构造函数:
public MyObject(int id){
ID = id;
}
答案 3 :(得分:0)
好吧,如果你真的需要为各种类型打造这个通用调用,那么恕我直言你应该使用:
Enum
; Int32
); 现在投射你的物体。
public static Int32 GetAnInt<T>(T arg) where T : struct
{
if ((typeof(T).IsEnum))
{
var underlyingType = typeof(T).GetEnumUnderlyingType();
if (underlyingType == typeof(Int32)
|| underlyingType == typeof(Int16)) //etc.
{
try
{
dynamic value = arg;
var result = (Int32)value; // can throw InvalidCast!
return result;
}
catch
{
throw;
}
}
else
{
throw new InvalidCastException("Underlying type
is certainly not castable to Int32!");
}
}
else
{
throw new InvalidCastException("Not an Enum!");
}
}
通过这种方式,您可以实现美妙的语法:var j = GetAnInt(MyEnum.FirstValue);
答案 4 :(得分:-1)
您使用的是属性枚举还是参数。
public enum Enum1{}
public Enum1 enum1 { get;set; }
public MyObject()
{
ID = (int)enum1;
}
试试吧。我希望它很有用。