2012-06-22 12 views
5

Tengo un control ... cualquier System.Windows.Forms.Control. decir por ej. etiqueta.Cómo encontrar valores de propiedad predeterminados de un control en tiempo de ejecución en C#

Deseo encontrar el valor predeterminado para su propiedad llamado "Habilitado" (puede ser cualquier propiedad para el caso). ¿Cómo lo hago?

1) Vea, en este caso, tenemos una etiqueta. El valor predeterminado de la etiqueta para la propiedad "Habilitado" es verdadero.

2) Ahora, en tiempo de ejecución, supongo que deseo averiguar cuál es el valor predeterminado para la propiedad "Habilitado" ... ¿cómo puedo averiguarlo?

3) Para empezar, tengo un objeto de mi control. A partir de ese objeto, solo puedo obtener el valor actual de la propiedad "Habilitado" pero no el valor DEFAULT.

Un enfoque posible a esta pregunta podría ser:

1) Identificar los tipos del control en tiempo de ejecución. 2) Inicialízalo usando su constructor predeterminado. 3) Encuentre el valor de la propiedad que nos interesa (Obviamente será el valor predeterminado) y allí ... tenemos el valor predeterminado.

Pero, en este caso ... no conozco mi control de antemano. Todo lo que sé es que puede haber cualquier control desde System.Windows.Forms.Control. Entonces, ¿cómo puedo inicializarlo y obtener su objeto? ¿Es posible?

¿Tiene alguna solución alternativa/mejor enfoque?

+1

No existe realmente ningún concepto de un control que tenga un valor "predeterminado". El diseñador de Visual Studio puede dar valores predeterminados de controles cuando se agregan al formulario, pero estos solo se escriben en el archivo .designer, p. myControl.Enabled = true; – PeteH

Respuesta

4

¡Esta es una buena oportunidad para usar la reflexión! Aquí es un método que debe obtener el valor por defecto de cualquier propiedad de cualquier clase que tiene un constructor por defecto (público, sin parámetros):

public static object GetDefaultPropertyValue(Type type, string propertyName) 
{ 
     if (type.GetConstructor(new Type[] { }) == null) 
      throw new Exception(type + " doesn't have a default constructor, so there is no default instance to get a default property value from."); 
     var obj = Activator.CreateInstance(type); 
     return type.GetProperty(propertyName).GetValue(obj, new object[] { }); 
} 

en cuenta que si usted está haciendo esto con un gran número de controles de los cuales hay pueden ser múltiplos de un solo tipo, es posible que desee almacenar en caché los resultados para cada tipo, ya que la reflexión es algo lenta.

+0

También es posible que también desee considerar el uso del atributo "DefaultValue" y leer eso también: type.GetCustomAttributes (typeof (System.ComponentModel.DefaultValueAttribute), false) –

3

Puede instanciar un objeto desconocido (en el momento del diseño) utilizando genéricos.

public class DefaultValueChecker<T> where T : System.Windows.Forms.Control, new() 
{ 
    public bool DetermineDefaultValue() { 
     var control = new T(); 
     return control.Enabled; 
    } 
} 
+1

Eso requiere * conocer el control de antemano *, que está explícitamente descartado en la pregunta. 'T' puede ser desconocido en el momento del diseño dentro de su clase' DefaultValueChecker ', pero cualquier código de llamada necesita saber' T' en el momento del diseño. –

+0

La pregunta dice "Tengo [...] System.Windows.Forms.Control". Y eso es exactamente lo que requiere mi ejemplo. Por favor vuelve a leer la pregunta, luego mi respuesta. –

+0

También dice * No conozco mi control de antemano. Todo lo que sé es que puede haber algún control desde System.Windows.Forms.Control. * Parece que el tipo de control no se conoce, por lo que no se puede usar como argumento de tipo. –

0

Esto generalmente no se puede descubrir. Los valores por defecto pueden ser cualquiera de los siguientes:

  • -codificado
  • dependiente de los recursos (intercambiables)
  • que dependen de la configuración del sistema

Con su enfoque sugerido, puede a lo sumo encontrar valores codificados Sin embargo, no tendrás forma de saber si están realmente codificados.

En cuanto a la segunda parte de la pregunta, esto puede resolverse utilizando la reflexión: Eche un vistazo a la clase Type (información de tipo de tiempo de ejecución) y la clase Activator (instanciación de tipo de tiempo de ejecución).

0

Puedes probar a utilizar la reflexión y la comprobación de atributo DefaultValue:

Type labelType = typeof(Label); 
DefaultValueAttribute attr = (DefaultValueAttribute)labelType 
    .GetProperty("AutoEllipsis") 
    .GetCustomAttributes(typeof(Defaul tValueAttribute),true) 
    .FirstOrDefault(); 
Console.WriteLine(attr.Value); 

Sin embargo, no todas las propiedades están anotados con este atributo, por lo que no todos los valores por defecto se pueden obtener de esta manera.

+0

En realidad, este atributo solo se usa para comparar el valor actual con un "predeterminado" para saber si los valores han cambiado y deben resaltarse en negrita en una cuadrícula de propiedades. – ja72

Cuestiones relacionadas