c#基于枚举确定继承的类并相应地调用子方法?

c#基于枚举确定继承的类并相应地调用子方法?,c#,inheritance,parent-child,C#,Inheritance,Parent Child,我想创建一个处理消息队列的基类,其中包含许多不同类型的继承类。现在我只想调用基类的ConsumeMessage方法,但是有没有一种方法可以让基类实例化继承的类并调用子Consume类?这将防止每个子类型的长case和if语句 子类可以由枚举(或其他内容)确定 大概是这样的: public enum EnumMessageTypes { Type1 = 1, Type2 = 2 } void main() { new Queue().ConsumeMessage(); }

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

子类可以由枚举(或其他内容)确定

大概是这样的:

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

是的,我想这是可以做到的。。。。但请不要那样做。实例化正确的派生
队列
。基类永远不应该知道其派生类的任何信息,这样做会破坏很多规则。没有不同类型的队列,只有一种队列可以处理不同类型的消息。从
队列
继承在这种上下文中没有多大意义,但是
消息
类层次结构可能很有用。谢谢Colin。我同意你的说法。但我也尝试使用许多if或case语句节省代码(并在创建新的子类时减轻负担)。我将用另一个备选方案更新我的问题,这可能会达到同样的目标。@SlavaUtesinov:为什么会更好?这要求枚举名和类名匹配,因此重命名某些名称将“悄悄地”破坏一切。是的,但作者写道,枚举值与类名相同,若你们有一百个类,那个将是非常大的开关构造。