改善属性监控代码? [英] Improve property monitoring code?

查看:112
本文介绍了改善属性监控代码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在C#游戏中制作了一个实用程序调试类,我正在努力能够监视和观察属性的值。就像这样:

  public static class Monitor 
{
private static List< object&监控对象;

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)
{
//不是实际代码,我实际上是在游戏中绘制这个
foreach 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属性(object o,string property)
{
obj = o;
propertyInfo = o.GetType()。GetProperty(property);
}
}



现在为了监控属性, FPS,我必须

  Monitor.Watch(new Property(Game,FPS)); 

难道不会有办法让这个更简单的使用吗?理想情况下我想能够做

  Monitor.Watch(Game.FPS); 

但是因为我们不能将指针存储到C#中的值类型,我不知道我该怎么做。也许使用闭包和lambada表达式?我以前建议这样做,但我不知道如何做到。

解决方案

任何其他方法可以改善这个方法吗?



我将做的是重做您的Monitor类接受 Func< string> 作为输入,并返回一个可用于unmonitor的监视句柄。 p>

通过这样做,你可以这样写:

  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)
{
//不是实际代码,我实际上是在游戏中绘制这个
foreach in monitoredObjects.Values)
Console.WriteLine(o()); //执行获取值...
}
}

d需要为句柄实现一些接口 - 但这真的可以是任何东西,因为它只是一个对象用作哈希表查找允许取消订阅。你只需要允许Unwatch工作,因为你需要一些方法来删除委托,你可能想要匿名定义(如我上面)。


I made a utility debug class in a C# game I'm working on to be able to monitor and watch values of properties. Goes like this:

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);
  }
 }

Now in order to monitor a property, say my game's FPS, I must do

Monitor.Watch(new Property(Game, "FPS"));

Wouldn't there be a way to somehow make this simpler to use? Ideally I'd like to be able to do

Monitor.Watch(Game.FPS);

But since we can't store pointers to value types in C#, I don't know how I would do this. Maybe using closures and lambada expressions? I was suggested this earlier but I'm not sure how to do it. Any other ways to improve this?

Thanks

解决方案

Personally, what I would do is rework your Monitor class to accept a Func<string> as input, and return a monitoring handle that could be used to "unmonitor" the class.

By doing that, you'd be able to write:

 var handle = Monitor.Watch( () => Game.FPS.ToString() );
 // later
 Monitor.Unwatch(handle);

This could look something like:

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...
    }
}

You'd need to implement some interface for the handle - but this really could be anything, since it's just an object used as a hash table lookup for allowing unsubscription. You only need this to allow "Unwatch" to work, since you need to have some way to remove the delegate, which you'll probably want to define anonymously (as I did above).

这篇关于改善属性监控代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆