c#根据Enum判断继承class并相应调用child方法?

c# Determine inherited class based on Enum and call child method accordingly?

我想创建一个基础 class 来处理消息队列,其中有许多继承的 class 用于不同类型。现在我只想调用 base class' ConsumeMessage 方法,但是有没有办法让 base class 实例化继承的 class 并调用 child Consume class?这将防止每个 child 类型的长 case 和 if 语句。

child class 可以通过枚举(或其他东西)来确定。

像这样:

public enum EnumMessageTypes
{
    Type1 = 1,
    Type2 = 2
}

void main()
{
   new Queue().ConsumeMessage();
}

public class Queue
{
     public abstract EnumMessageType MessageType();
     public virtual bool ConsumeMessage 
     {
            var Messages = GetMessagesFromDB(); //Get all unconsumed messages from DB
            foreach (int messageID in Messages)
            {
                //Determine child class from Messages.MessageType (which is the same as the Enum value)
                ChildClass = ??;  //Can this be done?
                ChildClass.ConsumeMessage(messageID);
            }

            return true;
     };
}

class Type1 : Queue
{
    public override EnumMessageTypes MessageType()
    {
        return EnumJobType.Type1;
    }

    //Process the item.
    public override bool ConsumeMessage(int messageID)
    {
        //Do something
    }
}

选择:

void main()
{
    var Messages = GetMessagesFromDB(); //Get all unconsumed messages from DB
    foreach (int messageID in Messages)
    {
        ChildClass = ??;  //Can I instantiate a child class 'abstractly'
        ChildClass.ConsumeMessage(messageID);
    }
}

你可以这样做:

var className = typeof(EnumMessageTypes).GetFields()[(int)message.MessageType].Name;
var ChildClass = (Queue)Activator.CreateInstance(null, className).Unwrap();
ChildClass.ConsumeMessage(message.ID);

如果你有命名空间,你也应该指定它:

var ChildClass = (Queue)Activator.CreateInstance(null, "MyNameSpace." + className ).Unwrap();