Если я правильно понимаю, вас просят записать в указанный файл информацию о событиях, вызванных при вызове некоторых указанных методов.Этот файл должен быть указан через class
уровень Attribute
.
Я думаю (не легко понять, что вы спрашиваете), Attribute
должен быть определен в универсальном типе T
.
Если это то, что вы спрашиваете, я бы сделал что-то похожее на следующее:
Определите ваш пользовательский атрибут:
[AttributeUsage(AttributeTargets.Class)]
public class LogFileAttribute: Attribute
{
readonly string path;
public LogFileAttribute(string path)
{
this.path = path;
}
public string Path { get { return this.path; } }
}
Измените класс вашего общего списка:
public class MyListClass<T> : IEnumerable<T>
{
public delegate void MyDelegate();
public event MyDelegate AddEvent;
public event MyDelegate RemEvent;
private LogFileAttribute logFileAttribute;
List<T> list;
public T this[int index]
{
get { return list[index]; }
set { list[index] = value; }
}
public void Add(T item)
{
list.Add(item);
if (AddEvent != null)
{
AddEvent();
}
if (this.logFileAttribute != null)
{
logEvent("Add");
}
}
public void Remove(T item)
{
list.Remove(item);
if (RemEvent != null)
{
RemEvent();
}
if (this.logFileAttribute != null)
{
logEvent("Remove");
}
}
public void RemoveAt(int index)
{
list.RemoveAt(index);
if (RemEvent != null)
{
RemEvent();
}
if (this.logFileAttribute != null)
{
logEvent("RemoveAt");
}
}
public MyListClass()
{
list = new List<T>();
checkLogFileAttribute();
}
public MyListClass(List<T> list)
{
this.list = list;
checkLogFileAttribute();
}
public IEnumerator<T> GetEnumerator()
{
return list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return list.GetEnumerator();
}
private void logEvent(string methodName)
{
File.AppendAllLines(this.logFileAttribute.Path, new string[] { methodName + " called." });
}
private void checkLogFileAttribute()
{
object[] attributes = typeof(T).GetCustomAttributes(typeof(LogFileAttribute), false);
if (attributes.Length > 0)
{
this.logFileAttribute = (LogFileAttribute)attributes[0];
}
}
}
Теперь, если вы определите следующий класс:
[LogFile(@"C:\EventLog.txt")]
public class Foo
{
readonly int id;
public Foo(int id)
{
this.id = id;
}
public int Id { get { return this.id; } }
}
И выполните следующий код:
MyListClass<Foo> foos = new MyListClass<Foo>();
foos.Add(new Foo(1));
foos.Add(new Foo(2));
вы получите желаемое поведение (если я правильно понял ваш вопрос).
РЕДАКТИРОВАТЬ: Удалено Append
Форма LogFileAttribute
, поскольку это не имеет никакого смысла вэтот контекст.