使用反射从队列中计数
本文关键字:队列 反射 | 更新日期: 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; }
}