2016-12-07 7 views
1

У меня есть этот код для установки параметров элементов управления в другой поток:с # Установка/Получение свойств элементов управления в/из другого потока

private delegate void SetPropertySafeDelegate<TResult>(System.Windows.Forms.Control @this, Expression<Func<TResult>> property, TResult value); 

    public static void SetProperty<TResult>(this System.Windows.Forms.Control @this, Expression<Func<TResult>> property, TResult value) 
    { 
     var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo; 

     if (propertyInfo == null || [email protected]().IsSubclassOf(propertyInfo.ReflectedType) || @this.GetType().GetProperty(propertyInfo.Name, propertyInfo.PropertyType) == null) 
     { 
      throw new ArgumentException("The lambda expression 'property' must reference a valid property on this Control."); 
     } 

     if (@this.InvokeRequired) 
     { 
      @this.Invoke(new SetPropertySafeDelegate<TResult>(SetProperty), new object[] { @this, property, value }); 
     } 
     else 
     { 
      @this.GetType().InvokeMember(propertyInfo.Name, BindingFlags.SetProperty, null, @this, new object[] { value }); 
     } 
    } 

это работает так:

label1.SetProperty(() => label1.Text, "xxx"); 

но мне это нужно для работы также по другим вопросам, таким как:

checkBox4.SetProperty(() => checkBox4.Checked, true); 

который не работает.

Вторая вещь, в которой я нуждаюсь, - это такая же функция для получения контрольного значения.

Большое спасибо за ваш совет.

ответ

1

Решение, которое работает для меня:

/// <summary> 
    /// Gets control property. Usage: label1.GetProperty2(() => label1.Text); 
    /// </summary> 
    public static object GetProperty2<TResult>(this Control @this, Expression<Func<TResult>> property) 
    { 
     var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo; 

     return @this.GetType().GetProperty(propertyInfo.Name, propertyInfo.PropertyType).GetValue(@this, null); 
    } 

    /// <summary> 
    /// Sets control property. Usage: label1.SetProperty2(() => label1.Text, "Zadej cestu k modelu."); 
    /// </summary> 
    public static void SetProperty2<TResult>(this Control @this, Expression<Func<TResult>> property, TResult value) 
    { 
     var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo; 

     if (@this.InvokeRequired) 
     { 
      @this.Invoke(new SetPropertySafeDelegate<TResult>(SetProperty2), new object[] { @this, property, value }); 
     } 
     else 
     { 
      @this.GetType().InvokeMember(propertyInfo.Name, BindingFlags.SetProperty, null, @this, new object[] { value }); 
     } 
    } 
    private delegate void SetPropertySafeDelegate<TResult>(Control @this, Expression<Func<TResult>> property, TResult value); 

 Смежные вопросы

  • Нет связанных вопросов^_^