with what qué net done .net reflection

.net - qué - what can be done with reflection in c#



Obtener el nombre de la propiedad de clase (6)

Tengo mi aplicación winform recopilando datos usando databinding. Todo se ve bien, excepto que tengo que vincular la propiedad con el textedit usando una cadena:

Me.TextEdit4.DataBindings.Add (New System.Windows.Forms.Binding ("EditValue", Me.MyClassBindingSource, "MyClassProperty", True))

Esto funciona bien, pero si cambio el nombre de la propiedad de la clase, el compilador obviamente no me avisará.

Me gustaría poder obtener el nombre de la propiedad por reflexión, pero no sé cómo especificar el nombre de la propiedad que quiero (solo sé cómo iterar entre todas las propiedades de la clase)

¿Alguna idea?


Si está utilizando C # 3.0, hay una manera de obtener el nombre de la propiedad de forma dinámica, sin código fijo.

private string GetPropertyName<TValue>(Expression<Func<BindingSourceType, TValue>> propertySelector) { var memberExpression = propertySelector.Body as MemberExpression; return memberExpression != null ? memberExpression.Member.Name : string.empty; }

Donde BindingSourceType es el nombre de clase de su instancia de objeto de BindingSourceType de datos.

Luego, podría usar una expresión lambda para seleccionar la propiedad que desea vincular, de una manera fuertemente tipada:

this.textBox.DataBindings.Add(GetPropertyName(o => o.MyClassProperty), this.myDataSourceObject, "Text");

Le permitirá refactorizar su código de forma segura, sin frenar todas sus cosas de enlace de datos. Pero usar árboles de expresión es lo mismo que usar la reflexión, en términos de rendimiento.

El código anterior es bastante feo y sin marcar, pero entiendes la idea.


1) Especifique el nombre de propiedad exacto que desea y manténgala así

2) Escribe una prueba que involucre ese nombre de propiedad.


Aquí hay un ejemplo de lo que estoy hablando:

[AttributeUsage(AttributeTargets.Property)] class TextProperyAttribute: Attribute {} class MyTextBox { [TextPropery] public string Text { get; set;} public int Foo { get; set;} public double Bar { get; set;} } static string GetTextProperty(Type type) { foreach (PropertyInfo info in type.GetProperties()) { if (info.GetCustomAttributes(typeof(TextProperyAttribute), true).Length > 0) { return info.Name; } } return null; } ... Type type = typeof (MyTextBox); string name = GetTextProperty(type); Console.WriteLine(name); // Prints "Text"


Irónicamente, la reflexión espera que proporciones el nombre de la propiedad para obtener su información :)

Puede crear un atributo personalizado, aplicarlo a la propiedad deseada. Entonces podrá simplemente obtener el nombre de la propiedad que tiene este atributo.


Puede reflejar un tipo, pero no puede reflejar sus miembros, excepto por su nombre.

Si esa fuera la única propiedad, o si supiera con certeza el orden, podría encontrarla por índice, pero en general, una cadena es la forma más segura de hacerlo.

Creo que cambiar el nombre causará una excepción de tiempo de ejecución, pero no estoy 100% seguro, en cualquier caso, esa es probablemente la mejor posibilidad.

Suponiendo que no ocurra ninguna excepción automáticamente, podría agregar una depuración. Afirme que comprueba si existe la propiedad con ese nombre, pero nuevamente eso es solo tiempo de ejecución.


Tendrá el mismo problema al usar la reflexión porque para encontrar la propiedad correcta en todas las propiedades del tipo, tendrá que saber su nombre, ¿verdad?