接受“generic”Enum作为参数的方法,然后在运行时强制转换为diff enum类型

时间:2017-05-13 02:21:30

标签: c# enums

如果主题的标题是准确的,我不肯定。

我有一类不同的枚举:

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'转换为正确的类型但是如何在运行时完成?这里的反思是一种选择,还是有另一种方式?

1 个答案:

答案 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}");
    }
}

与输出一样:

enter image description here