c#根据Enum确定继承的类并相应调用子方法?

时间:2016-09-09 08:01:03

标签: c# inheritance parent-child

我想创建一个基类来处理消息队列,其中包含许多不同类型的继承类。现在我只想调用基类的ConsumeMessage方法,但是有没有一种方法可以让基类实例化继承的类并调用子Consume类?这将防止每种子类型的长情况和if语句。

子类可以由Enum(或其他)确定。

这样的事情:

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);
    }
}

1 个答案:

答案 0 :(得分:1)

你可以这样做:

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();