Лично я бы переделал ваш класс Monitor, чтобы принять Func<string>
в качестве ввода, и вернуть дескриптор мониторинга, который можно было бы использовать для «мониторинга» класса.
Сделав это, вы сможете написать:
var handle = Monitor.Watch( () => Game.FPS.ToString() );
// later
Monitor.Unwatch(handle);
Это может выглядеть примерно так:
public static class Monitor
{
private static Dictionary<IMonitorHandle, Func<string>> monitoredObjects;
public static void Initialize()
{
monitoredObjects = new Dictionary<IMonitorHandle, Func<string>>();
}
public static IMonitorHandle Watch(Func<string> o)
{
var handle = new MonitorHandle(o);
monitoredObjects.Add(handle, o);
return handle;
}
public static void Unwatch(IMonitorHandle handle)
{
monitoredObjects.Remove(handle);
}
public static void Draw(RenderWindow app)
{
//Not actual code, I actually draw this in game
foreach (object o in monitoredObjects.Values)
Console.WriteLine(o()); // Execute to get value...
}
}
Вам потребуется реализовать некоторый интерфейс для дескриптора - но это действительно может быть что угодно, поскольку это просто объект, используемый в качестве поиска в хеш-таблице для разрешения отписки. Это нужно только для того, чтобы разрешить «Unwatch» работать, поскольку у вас должен быть способ удалить делегат, который вы, вероятно, захотите определить анонимно (как я делал выше).