所以,我有一个名为LogEvent的基础对象,我创建了其他派生的类,例如ExecuteEvent或SubmitEvent。当我尝试获取特定实例的类型时,它们总是以LogEvent的形式返回。以下是每个类的定义:
class LogEvent
{
public List<LogEventAttribute> eventAttributes = new List<LogEventAttribute>();
public int clusterId;
public DateTime eventTime;
public LogEvent(List<LogEventAttribute> eventAttributes)
{
this.eventAttributes = eventAttributes;
this.clusterId = Convert.ToInt32(eventAttributes.Find(p => p.name.Equals("Cluster")).value);
this.eventTime = DateTime.Parse(eventAttributes.Find(p => p.name.Equals("EventTime")).value);
}
}
class SubmitEvent : LogEvent
{
public string submitHost;
public SubmitEvent(List<LogEventAttribute> eventAttributes)
: base(eventAttributes)
{
this.submitHost = eventAttributes.Find(p => p.name.Equals("SubmitHost")).value;
}
}
class ExecuteEvent : LogEvent
{
public string executeHost;
public ExecuteEvent(List<LogEventAttribute> eventAttributes)
: base(eventAttributes)
{
this.executeHost = eventAttributes.Find(p => p.name.Equals("ExecuteHost")).value;
}
}
class TerminatedEvent : LogEvent
{
public bool successful;
public TerminatedEvent(List<LogEventAttribute> eventAttributes)
: base(eventAttributes)
{
this.successful = Convert.ToBoolean(eventAttributes.Find(p => p.name.Equals("TerminatedNormally")).value);
}
}
class LogEventAttribute
{
public string name, type, value;
public LogEventAttribute(string name, string type, string value)
{
this.name = name;
this.type = type;
this.value = value;
}
}
在这里,我尝试根据班级的类型做不同的事情:
switch (currentEvent.GetType().ToString())
{
case "ExecuteEvent":
ExecuteEvent currentExEvent = currentEvent as ExecuteEvent;
item.SubItems.Add("Job executed by " + currentExEvent.executeHost);
break;
case "SubmitEvent":
SubmitEvent currentSubEvent = currentEvent as SubmitEvent;
item.SubItems.Add("Job submitted by " + currentSubEvent.submitHost);
break;
}
交换机总是被传递,因为currentEvent.GetType()。ToString()总是出现在LogEvent中。
编辑:问题是我首先以不同的方式创建这些不同的类。这是错误的代码:
LogEventAttribute eventTypeAttribute = currentEventAttributes.Find(p => p.name.Equals("MyType"));
string eventType = eventTypeAttribute.type;
switch (eventType)
{
case "SubmitEvent":
logEvents.Add(new SubmitEvent(currentEventAttributes));
break;
case "ExecuteEvent":
logEvents.Add(new ExecuteEvent(currentEventAttributes));
break;
case "TerminatedEvent":
logEvents.Add(new TerminatedEvent(currentEventAttributes));
break;
default:
logEvents.Add(new LogEvent(currentEventAttributes));
break;
}
在我从eventTypeAttribute获取属性“type”的第二行,我应该获取value属性。我使用type属性来确定属性在其value属性中存储的值的类型。唉,TGIF。
答案 0 :(得分:1)
如果您实际从LogEvent
获取GetType
的类型对象,那么您将拥有LogType
类的实例,而不是任何派生类的实例。但是,我认为你没有得到你认为的结果。
在ToString()
对象上使用Type
将返回完整的命名空间,例如"MyApp.ExecuteEvent"
而不是"ExecuteEvent"
。
改为使用Name
属性:
switch (currentEvent.GetType().Name)
答案 1 :(得分:1)
您可以使用is
关键字进行类型检查,例如currentEvent is ExecuteEvent
,这也可以消除拼写错误的可能性。此外,currentEvent is LogEvent
将返回true,因为,就像Jared所说,它是LogEvent
。
答案 2 :(得分:0)
试试这个:
ExecuteEvent executeEvent = currentEvent as ExecuteEvent;
if (executeEvent != null)
{
item.SubItems.Add("Job executed by " + currentExEvent.executeHost);
}