2010-07-17 60 views
1

我想使用Interlocked.Increment遞增對象的整數成員,但我想通過反射來引用這些整數。下面是示例代碼,它不起作用。Interlocked.Increment of Reflected Value Type

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方法使其工作?

+0

爲什麼不首先使用鎖定/顯示器?如果您正在進行反射,則Interlocked.Increment()的性能優勢可能無法看到。此外,您不能確定別人是否同時修改相同的變量(使用或不使用反射)(無論您如何鎖定)。 – 2010-07-19 09:32:45

回答

1

這不能通過設計工作。一個int是一個值類型。 GetValue()方法返回int的一個副本。您將增加該副本,而不是原始副本。反射無法獲取對值類型值的引用。

+1

他可以在'DynamicMethod'中使用'Reflection.Emit'來訪問字段類型。儘管如此,這將是複雜而緩慢的。 – 2010-07-17 11:10:57

相關問題