如果主题的标题是准确的,我不肯定。
我有一类不同的枚举:
public class Enums
{
public enum StringActions
{
FIRSTNAME,
MIDDLEINITIAL,
LASTNAME
}
public enum IntegerAction
{
RANGE,
RANDOM
}
}
我有一个构造函数的对象,我想接受一个通用的Enums参数,该参数能够接受StringAction或IntegerAction。我有字典(每个枚举类型一个),这些字典将这些枚举作为键,并作为值委托。我想使用传入的枚举来查找该枚举的正确委托,然后使用它进行一些工作。
public class DataPoint
{
public DataPoint(Enum mAction)
{
if (mAction == Enums.StringAction)
{
var act = StringActionDictionary[mAction];
}
else if (mAction == Enums.IntegerAction)
{
var act = IntegerActionDictionary[mAction];
}
...
}
}
通过这个实现,我需要将'mAction'转换为正确的类型但是如何在运行时完成?这里的反思是一种选择,还是有另一种方式?
答案 0 :(得分:1)
仅提供两个构造函数会更有意义,每个构造函数都采用不同的enum
。这将使您的代码更有意义,更易于消费者理解:
public class DataPoint
{
public DataPoint(Enums.StringAction mAction)
{
DoSomeWorkWithStringAction(mAction);
}
public DataPoint(Enums.IntegerAction mAction)
{
DoSomeWorkWithIntegerAction(mAction);
}
// Rest of class omitted
但是,如果您确实想提供通用实现,可以使用is
关键字检查传入的Enum
的类型,然后将其转换为{{内部的相应类型1}}阻止所以你可以使用它。只要认识到这个构造函数将接受任何旧的枚举,包括你没有条件的那些。
例如:
if
在任何一种情况下,类的实例化看起来都是一样的:
public class DataPoint
{
public DataPoint(Enum mAction)
{
if (mAction is Enums.StringAction)
{
DoSomeWorkWithStringAction((Enums.StringAction)mAction);
}
else if (mAction is Enums.IntegerAction)
{
DoSomeWorkWithIntegerAction((Enums.IntegerAction)mAction);
}
}
private void DoSomeWorkWithIntegerAction(Enums.IntegerAction actionToTake)
{
Console.WriteLine($"Enum was an IntegerAction, with action: {actionToTake}");
}
private void DoSomeWorkWithStringAction(Enums.StringAction actionToTake)
{
Console.WriteLine($"Enum was a StringAction, with action: {actionToTake}");
}
}
与输出一样: