使用反射从队列中计数

本文关键字:队列 反射 | 更新日期: 2023-09-27 18:37:04

我一直在尝试调用队列上的计数属性。我尝试了各种调用。如何从队列的计数中获取计数的 int 值?

我尝试使用但不起作用的语法是

(ConsoleKey)Dequeue.Invoke(InputQueue, new object[] { });

正确的语法是: var queueObj = InputQueue.GetMethod.Invoke(magicClassObject, new object[] { });

      public class ReflectionAttempts
        {
            Type magicType;
            object magicClassObject;
            MethodInfo UpdateView;
            PropertyInfo InputQueue;
            PropertyInfo Count;
            MethodInfo Dequeue;
            public ReflectionAttempts(Type magicType)
            {
                this.magicType = magicType;
                magicClassObject = Activator.CreateInstance(magicType);
                InputQueue = magicType.GetProperty("InputQueue");
                Count = InputQueue.PropertyType.GetProperty("Count");
                Dequeue = InputQueue.PropertyType.GetMethod("Dequeue");
                var queueObj =  InputQueue.GetMethod.Invoke(magicClassObject, new object[] { });
                int theCount = (int) Count.GetMethod.Invoke(queueObj, new object[] { });
                Input abc = (Input)  Dequeue.Invoke(queueObj, new object[] { });
            }
        }

使用反射从队列中计数

很高兴它对您有用,这里是答案:

您不能使用InputQueue作为Invoke的参数,因为它是PropertyInfo。您应该通过获取 Get 方法并在对象上调用它来获取 InputQueue 属性的值。类似的东西

var queueObj = InputQueue.GetMethod.Invoke(magicClassObject, new object[]{})

然后改用queueObj

Dequeue.Invoke(queueObj, ...);

本质上是:

PropertyInfo piCount = ...;
var count = (int)piCount.GetValue(InputQueue);

但我强烈建议在不需要使用反射(如果可能)时以这种方式重新设计它。这不是一个好的设计,缓慢,难以实现和维护。

喜欢这个:

class GameStateMachine<T> where T : GameViewMachine
{
}
abstract class GameViewMachine
{
  public int Count { get; }
  public IQueue InputQueue { get; }
}