una tag sirve que propiedades propiedad para metodos esperaba declarar como clase atributos agregar acceso c# string eval accessor databinder

c# - tag - Acceder a la propiedad del objeto como cadena y establecer su valor



propiedades de una clase c# (8)

En primer lugar, debes evitar usar esto; C # es un lenguaje muy tipográfico, así que aproveche las ventajas de seguridad y tipo que acompañan a este aspecto.

Si tiene un motivo legítimo para obtener y establecer el valor de una propiedad dinámicamente (en otras palabras, cuando el tipo y / o el nombre de la propiedad no se pueden definir en el código), tendrá que usar la reflexión.

La forma más parecida a la línea sería esta:

object value = typeof(YourType).GetProperty("PropertyName").GetValue(yourInstance); ... typeof(YourType).GetProperty("PropertyName").SetValue(yourInstance, "value");

Sin embargo, puede almacenar en caché el objeto PropertyInfo para hacerlo más legible:

System.Reflection.PropertyInfo prop = typeof(YourType).GetProperty("PropertyName"); object value = prop.GetValue(yourInstance); ... prop.SetValue(yourInstance, "value");

Tengo una instancia de la clase Account . Cada objeto de cuenta tiene un propietario, referencia, etc.

Una forma en que puedo acceder a las propiedades de una cuenta es a través de los accesores como

account.Reference;

pero me gustaría poder acceder a él utilizando selectores de cadena dinámicos como:

account["PropertyName"];

al igual que en JavaScript. Así que tendría la account["Reference"] que devolvería el valor, pero también me gustaría poder asignar un nuevo valor después de eso, como:

account["Reference"] = "124ds4EE2s";

Me he dado cuenta de que puedo usar

DataBinder.Eval(account,"Reference")

para obtener una propiedad basada en una cadena, pero al usar esto no puedo asignar un valor a la propiedad.

¿Alguna idea de cómo podría hacer eso?


Estoy de acuerdo con los pósters anteriores de que probablemente necesite usar las propiedades. La reflexión es muy lenta en comparación con el acceso directo a la propiedad.

Por otro lado, si necesita mantener una lista de propiedades definidas por el usuario, entonces no puede usar las propiedades de C #. Debe fingir que es un Dictionary o debe exponer una propiedad que se comporta como un Dictionary . Aquí hay un ejemplo de cómo podría hacer que la clase de la cuenta sea compatible con las propiedades definidas por el usuario:

public class Account { Dictionary<string, object> properties; public object this[string propertyName] { get { if (properties.ContainsKey[propertyName]) return properties[propertyName]; else return null; } set { properties[propertyName] = value; } } }


Necesitas usar Reflection:

PropertyInfo property = typeof(Account).GetProperty("Reference"); property.SetValue(myAccount, "...", null);

Tenga en cuenta que esto será muy lento.


Personalmente prefiero trabajar con métodos de extensión, así que aquí está mi código:

public static class ReflectionExtensions { public static void SetPropertyValue(this object Target, string PropertyName, object NewValue) { if (Target == null) return; //or throw exception System.Reflection.PropertyInfo prop = Target.GetType().GetProperty(PropertyName); if (prop == null) return; //or throw exception object value = prop.GetValue(Target, null); prop.SetValue(Target, NewValue, null); } }


Podría intentar combinar el indexador con la reflexión ...

public object this[string propertyName] { get { PropertyInfo property = GetType().GetProperty(propertyName); return property.GetValue(this, null); } set { PropertyInfo property = GetType().GetProperty(propertyName); property.SetValue(this,value, null); } }


Si son sus propios objetos, puede proporcionar un indexador para acceder a los campos. Realmente no lo recomiendo pero permitiría lo que quieres.

public object this[string propertyName] { get { if(propertyName == "Reference") return this.Reference; else return null; } set { if(propertyName == "Reference") this.Reference = value; else // do error case here } }

Tenga en cuenta que pierde seguridad de tipo al hacer esto.


Si usa .Net 4, puede usar la palabra clave dinámica ahora.

dynamic foo = account; foo.Reference = "124ds4EE2s";


Utilicé el método de reflexión de Richard, pero elaboré el método de configuración para manejar otros tipos que se utilizan, como cadenas y nulos.

public object this[string propertyName] { get { PropertyInfo property = GetType().GetProperty(propertyName); return property.GetValue(this, null); } set { PropertyInfo property = GetType().GetProperty(propertyName); Type propType = property.PropertyType; if (value == null) { if (propType.IsValueType && Nullable.GetUnderlyingType(propType) == null) { throw new InvalidCastException(); } else { property.SetValue(this, null, null); } } else if (value.GetType() == propType) { property.SetValue(this, value, null); } else { TypeConverter typeConverter = TypeDescriptor.GetConverter(propType); object propValue = typeConverter.ConvertFromString(value.ToString()); property.SetValue(this, propValue, null); } } }

La función SetValue () lanzará un error si la conversión no funciona.