2010-07-17 4 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() может быть не видна в любом случае. Кроме того, вы не можете быть уверены, что кто-то еще модифицирует одну и ту же переменную (с или без отражения) одновременно (независимо от того, как вы блокируете). –

ответ

1

Это не может работать по дизайну. Int - тип значения. Метод GetValue() возвращает копию int. Вы увеличите эту копию, а не оригинал. Отражение не имеет никакого способа получить ссылку на значение типа значения.

+1

Он мог использовать 'Reflection.Emit' в' DynamicMethod' для доступа к типу поля. Однако было бы сложно и медленно. –