代码之家  ›  专栏  ›  技术社区  ›  Brent Arias

互锁,反射值类型增量

  •  1
  • Brent Arias  · 技术社区  · 16 年前

    我想使用interlocked.increment增加一个对象的整数成员,但是我想通过反射引用这些整数。下面是我所拥有的不起作用的示例代码。

    public class StatBoard
    {
    
        #region States (count of)
        public int Active;
        public int Contacting;
        public int Polling;
        public int Connected;
        public int Waiting;
        public int Idle;
        #endregion
    
        protected IEnumerable<FieldInfo> states;
    
        public StatBoard()
        {
            Type foo = GetType();
            FieldInfo[] fields = foo.GetFields(BindingFlags.Instance & BindingFlags.Public);
    
            states = from n in fields
                         where n.FieldType == typeof(int)
                         select n;
    
        }
    
        public void UpdateState(string key)
        {
            FieldInfo statusType = states.First( 
                i => i.Name == key
            );
    
            System.Threading.Interlocked.Increment(ref (int)statusType.GetValue(this));
        }
    
    }
    

    如何修改updateState方法以使其正常工作?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    这在设计上是行不通的。int是值类型。getValue()方法返回int的副本。您将增加该副本,而不是原始副本。反射无法获取对值类型值的引用。