1

そのため、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」を取得している2行目では、代わりにvalueプロパティを取得している必要があります。typeプロパティを使用して、属性がvalueプロパティに格納している値のタイプを判別していました。ああ、TGIF。

4

3 に答える 3

1

LogEventからの型オブジェクトを実際に取得する場合、派生クラスのGetTypeインスタンスではなく、クラスのインスタンスがあります。LogTypeしかし、私はあなたがあなたが得ると思うものをあなたが得るとは思いません。

オブジェクトで使用ToString()すると、たとえばではなくType、完全な名前空間が返されます。"MyApp.ExecuteEvent""ExecuteEvent"

Name代わりにプロパティを使用してください:

switch (currentEvent.GetType().Name)
于 2012-12-07T14:26:08.260 に答える
1

isのようなタイプチェックにキーワードを使用するとcurrentEvent is ExecuteEvent、タイプミスの可能性もなくなります。さらに、currentEvent is LogEventJaredが言ったように、それはであるため、trueを返しますLogEvent

于 2012-12-07T14:27:14.947 に答える
0

これを試して:

ExecuteEvent executeEvent = currentEvent as ExecuteEvent;
if (executeEvent != null) 
{
 item.SubItems.Add("Job executed by " + currentExEvent.executeHost);
}
于 2012-12-07T14:26:15.553 に答える