2012-11-27 129 views
1

我有两个枚举器和一个采用枚举器的方法。它们被称为ABC和DEF,并且该方法被称为TestMethod(Enum myEnum)。代码如下:确定枚举类型

public enum ABC 
{ 
    Zero, 
    One, 
    Two 
}; 

public enum DEF 
{ 
    Zero, 
    One, 
    Two 
}; 

public void TestEnum(Enum myEnum) 
{ 
    ... 
} 

函数TestEnum接受任何枚举器。我如何测试两个参数中的哪一个属于?我可以盲目地开始用try/catch铸造测试它,但是看起来丑陋。任何更干净的方法呢?预先感谢您的任何帮助。

回答

6

我该如何测试两个参数中哪一个参数属于?

您只需调用GetType

Type type = myEnum.GetType(); 

目前尚不清楚你想要什么后做有了它,你要知道。

或者:

if (myEnum is ABC) 
{ 
} 
else if (myEnum is DEF) 
{ 
} 

编辑:如果你能够改变方法签名如果你的来电者知道的类型,然后按叶普的评论,你可以使用:

public void TestEnum<T>(T value) where T : struct 
{ 
    // Use typeof(T) here 
} 

您不能将T约束为具有普通C#的枚举类型......尽管有编写代码的hacky ways,但通过后处理应用了此类约束。

+1

耶稣乔恩,我甚至不能接受你的答案再过12分钟。在我发布之前,你是否读过我的想法并写出来?大声笑。我会尽快给你一个复选标记,谢谢你的闪电般的快速反应,以及为这样一个愚蠢的小问题编写小程序。< – Lukas

+0

@Lukas你也可以让你的方法成为通用的。这就像这样:'public void TestEnum (TEnum myEnum)其中TEnum:struct {/ *方法体在这里* /}'。这避免了拳击。例如,您可以使用'typeof(TEnum)'来获得类型。与此问题是,C#语言目前不允许您将类型参数“TEnum”限制为...枚举。 –

+0

@JeppeStigNielsen:我会添加该选项。 (我认为方法签名是固定的。)你可能也想看看我的Unconstrained Melody库:) https://code.google.com/p/unconstrained-melody/ –

1

斯基特先生已经钉了这个,但!

两种方法呢?

public void TestEnum(ABC abcEnum) { 
    //do ABC stuff 
} 

public void TestEnum(DEF defEnum) { 
    //do DEF stuff 
} 

你得到了你需要的分支,但不必担心获得if语句的权利。真的,它只是一个if语句,但如果你添加枚举GHI。现在有一些未被记录的TestEnum处理输入。使用重载的方法,你可以在编译时捕捉到(甚至更好,intellisense会抓住你)。

+0

有很多正确的答案,尽管我喜欢和使用乔恩的我会给你一个观点,因为它是正确的。 – Lukas