我想创建一个基类来处理消息队列,其中包含许多不同类型的继承类。现在我只想调用基类的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);
}
}
答案 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();