¿Hay alguna manera de hacer que un atributo "Examinable" sea condicional, por lo que la propiedad que lo aplica aparecerá algunas veces en la página de propiedades y otras no?
gracias :)Atributo "Navegable" condicional
Respuesta
No hay una manera fácil.
Posiblemente pueda resolver esto implementando ICustomTypeDescriptor. Aquí hay un buen artículo sobre implementing ICustomTypeDescriptor.
O puede asociar su propio ControlDesigner con su clase y anular el método PreFilterProperties para agregar o eliminar propiedades vistas en la cuadrícula de propiedades.
Puede hacerlo proporcionando un modelo de tipo personalizado; en el nivel más simple, puede proporcionar un TypeDescriptor
personalizado para su tipo derivado de ExpandableObjectConverter
, y simplemente incluir/excluir la propiedad dada a capricho, pero esto solo funciona con PropertyGrid
- utilizado por la página de propiedades. Un enfoque más complejo es usar ICustomTypeDescriptor
/TypeDescriptionProvider
- esto puede funcionar en cosas como DataGridView
me encontré con esto en busca de una forma de declarar ciertos miembros visible o escondido en IntelliSense y ser capaz de cambiar una vez por todas que necesitaba ser escondido en tiempo de compilación. No puedo decir si eso es lo que estabas buscando o no, pero encontré una respuesta a mi pregunta ... pensé que no estaría de más compartir.
puse un símbolo condicional compilación (que se encuentra en el separador Crear de propiedades del proyecto) IS_VIS (valor de ser cierto si desea que ciertos miembros para mostrar, falsa si su falta de ocultarlas) y luego:
#if IS_VIS
public const System.ComponentModel.EditorBrowsableState isVis =
ComponentModel.EditorBrowsableState.Always;
#else
public const System.ComponentModel.EditorBrowsableState isVis =
ComponentModel.EditorBrowsableState.Never;
#endif
a continuación referencia a la variable isVis en el atributo:
[EditorBrowsable(isVis)]
public string myMethod...
hice esto en VB y esto fue convertido a toda prisa a C#. Si algo no funciona bien, házmelo saber.
No estoy seguro de que esto se aplique a su situación, pero puede ajustar la decoración de "Navegable" en tiempo de ejecución llamando a la función a continuación.
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void setBrowsableProperty(string strPropertyName, bool bIsBrowsable)
{
// Get the Descriptor's Properties
PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName];
// Get the Descriptor's "Browsable" Attribute
BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);
// Set the Descriptor's "Browsable" Attribute
isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
}
Hola. Estoy buscando algo como esto. Cuando uso su código, obtengo una excepción nullValue en la primera línea 'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties (this.GetType()) [strPropertyName];'.Quiero saber dónde colocar estas funciones y cómo se refleja en la cuadrícula de propiedades (no vi un objeto propertyGrid en la función). –
Muchas gracias por su solución, cambié la línea a 'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties (vObject.GetType()) [strPropertyName];', donde vObject es el objeto que estoy alterando. –
Como una mejora en la respuesta de @ neoikon arriba y para evitar la excepción Ganesh menciona en los comentarios, aquí es una versión que utiliza los genéricos para obtener el tipo:
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void SetBrowsableProperty<T>(string strPropertyName, bool bIsBrowsable)
{
// Get the Descriptor's Properties
PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(typeof(T))[strPropertyName];
// Get the Descriptor's "Browsable" Attribute
BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);
// Set the Descriptor's "Browsable" Attribute
isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
}
A continuación, puede añadir también una versión que toma una instancia:
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="obj">An instance of the object whose property should be modified.</param>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void SetBrowsableProperty<T>(T obj, string strPropertyName, bool bIsBrowsable)
{
SetBrowsableProperty<T>(strPropertyName, bIsBrowsable);
}
Uso:
class Foo
{
[Browsable(false)]
public string Bar { get; set; }
}
void Example()
{
SetBrowsableProperty<Foo>("Bar", true);
Foo foo = new Foo();
SetBrowsableProperty(foo, "Bar", false);
}
- 1. C#! Atributo condicional?
- 2. Atributo condicional en una función virtual
- 3. Validación del modelo/ASP.NET MVC 3 - Atributo requerido condicional
- 4. excepción de atributo condicional con el Código de Contratos
- 5. ¿Hay un atributo Condicional en el nivel de clase?
- 6. Html.TextBox atributo condicional con ASP.NET MVC Vista previa 5
- 7. Atributo condicional de C# en el miembro de interfaz
- 8. Versión descargable/navegable del código fuente de .NET Framework?
- 9. ¿Cómo creo un intento navegable en el manifiesto de Android?
- 10. SP_WHO2 condicional?
- 11. Sucursales condicional
- 12. condicional establece un atributo de un elemento con los documentos JSP (JSPX)
- 13. ¿Es posible usar el operador condicional EL en el atributo de acción?
- 14. ¿Cómo añado de manera condicional un atributo de identificación en TAL (PHPTAL)?
- 15. WPF: binding, setter de propiedad condicional
- 16. Reinicio condicional en la actividad onConfigurationChanged
- 17. flotador condicional en bash
- 18. Redirección condicional en JSF
- 19. Compilación condicional en Scala
- 20. condicional `ctypedef` con Cython
- 21. Evaluar expresión condicional
- 22. Powershell y operador condicional
- 23. operador condicional con DataBinder.Eval
- 24. Condicional XAML (WPF)
- 25. Problema del operador condicional
- 26. Autenticación HTTP condicional básica
- 27. clave externa condicional PostgreSQL
- 28. O condicional en makefile
- 29. operador condicional en Velocity
- 30. Expansión de macro condicional
el enlace para implementar ICustomTypeDescriptor.got señaló a https://msdn.microsoft.com/magazine/msdn-magazine-issues Creo que han eliminado la página original – gg89