我有SortedDictionary
个活动,人们可以购买门票。事件代码对于存储为密钥的票证是唯一的。
protected SortedDictionary<int, Event> Events = new SortedDictionary<int, Event>();
一个例子如下:
Events.Add(123, new Event(...));
我实现了一个记录器,以便能够跟踪事件。看起来像这样:
class EventLogger
{
protected SortedDictionary<int, EventLogType[]> Events = new SortedDictionary<int, EventLogType[]>();
public EventLogger()
{
}
public void Log(int eventCode, EventLogType type)
{
KeyValuePair<int, EventLogType[]> e;
if (Events.ContainsKey(eventCode))
{
(e = Events.FirstOrDefault(x => x.Key.Equals(eventCode)))
.Value[e.Value.Count()] = type;
}
else Events.Add(eventCode, new EventLogType[] { type });
}
}
enum EventLogType
{
PURCHASE,
CREATE,
UPDATE,
DELETE
}
例如,当我创建一个事件时,我现在必须调用此Log方法:
(new EventLogger()).Log(123, EventLogType.CREATE); // EventLogger instance is stored static
每当我要更新,删除或创建时,这都会变得很痛苦。我研究了如何更改set
对数组的工作方式,并尝试了以下方法:
protected SortedDictionary<int, Event> Events { get; set {
this.save();
} } = new SortedDictionary<int, Event>();
但这会引发IDE错误:
只有自动实现的属性才能具有初始化程序。
在数组中存储或更新任何内容之前,如何访问set
调用。如何检查正在执行的操作?因此,可以在.Add
中或在其值被更新或删除时进行操作,而不是分别调用日志?
我当前的代码如下:
Events.Add(123, new Event(...));
Logger.Log(123, EventLogType.CREATE);
当我打电话给.Add
答案 0 :(得分:1)
为什么不使用继承? 创建一个自己的示例,例如“ MySortedDictionary”,它继承自SortedDictionary,并将所需的事件添加到“ MySortedDictionary”中。
作为示例,您可以尝试以下操作,只是将其破解,我很懒,因此带有事件的类结构不是最佳的。
using System;
using System.Collections.Generic;
namespace SortedDictionrayTest
{
class AddingEventArgs<TKey, TValue> : EventArgs
{
public TKey Key
{
get;
}
public TValue Value
{
get;
}
public AddingEventArgs(TKey key, TValue value)
{
this.Key = key;
this.Value = value;
}
}
class AddedEventArgs<TKey, TValue> : AddingEventArgs<TKey, TValue>
{
public AddedEventArgs(TKey key, TValue value) : base(key, value)
{
}
}
class MySortedDictionay<TKey, TValue> : SortedDictionary<TKey, TValue>
{
public event EventHandler<AddingEventArgs<TKey, TValue>> Adding;
public event EventHandler<AddedEventArgs<TKey, TValue>> Added;
public new void Add(TKey key, TValue value)
{
this.OnAdding(new AddingEventArgs<TKey, TValue>(key, value));
base.Add(key, value);
this.OnAdded(new AddedEventArgs<TKey, TValue>(key, value));
}
protected virtual void OnAdding(AddingEventArgs<TKey, TValue> args)
{
if (this.Adding != null)
{
Adding(this, args);
}
}
protected virtual void OnAdded(AddedEventArgs<TKey,TValue> args)
{
if (this.Added != null)
{
Added(this, args);
}
}
}
class Program
{
static void Main(string[] args)
{
var sortedDict = new MySortedDictionay<int, string>();
sortedDict.Adding += SortedDict_Adding;
sortedDict.Added += SortedDict_Added;
sortedDict.Add(2, "World");
sortedDict.Add(1, "Hello");
Console.WriteLine("---");
foreach (KeyValuePair<int, string> keyValuePair in sortedDict)
{
Console.WriteLine($"key: [{keyValuePair.Key}] value: [{keyValuePair.Value}]");
}
}
private static void SortedDict_Adding(object sender, AddingEventArgs<int, string> e)
{
Console.WriteLine($"before adding key: [{e.Key}] value: [{e.Value}]");
}
private static void SortedDict_Added(object sender, AddedEventArgs<int, string> e)
{
Console.WriteLine($"after adding key: [{e.Key}] value: [{e.Value}]");
}
}
}