Ale*_*pin 5 c# reflection closures properties
我在C#游戏中制作了一个实用程序调试类,我正在努力监视和查看属性值.像这样:
public static class Monitor
{
private static List<object> monitoredObjects;
public static void Initialize()
{
monitoredObjects = new List<object>();
}
public static void Watch(object o)
{
monitoredObjects.Add(o);
}
public static void Unwatch(object o)
{
monitoredObjects.Remove(o);
}
public static void Draw(RenderWindow app)
{
//Not actual code, I actually draw this in game
foreach (object o in monitoredObjects)
Console.WriteLine(o.ToString());
}
}
public class Property
{
private object obj;
private PropertyInfo propertyInfo;
public override string ToString()
{
return propertyInfo.Name + ": " + propertyInfo.GetValue(obj, null).ToString();
}
public Property(object o, string property)
{
obj = o;
propertyInfo = o.GetType().GetProperty(property);
}
}
Run Code Online (Sandbox Code Playgroud)
现在为了监控一个房产,说我的游戏的FPS,我必须这样做
Monitor.Watch(new Property(Game, "FPS"));
Run Code Online (Sandbox Code Playgroud)
难道不会有办法以某种方式使这个更简单使用?理想情况下,我希望能够做到
Monitor.Watch(Game.FPS);
Run Code Online (Sandbox Code Playgroud)
但是因为我们无法在C#中存储指向值类型的指针,所以我不知道如何做到这一点.也许使用闭包和lambada表达式?我之前提出过这个建议,但我不知道该怎么办.还有其他方法可以改善吗?
谢谢
就个人而言,我要做的是重写您的Monitor类以接受Func<string>输入,并返回一个可用于"取消监视"该类的监视句柄.
通过这样做,你可以写:
var handle = Monitor.Watch( () => Game.FPS.ToString() );
// later
Monitor.Unwatch(handle);
Run Code Online (Sandbox Code Playgroud)
这看起来像是这样的:
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...
}
}
Run Code Online (Sandbox Code Playgroud)
你需要为句柄实现一些接口 - 但这确实可以是任何东西,因为它只是一个用作哈希表查找的对象,允许取消订阅.你只需要这样就可以让"Unwatch"工作,因为你需要有一些方法来删除你可能想要匿名定义的委托(正如我上面所做的那样).
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |