C # setting / obteniendo las propiedades de clase por nombre de cadena

Lo que trato de hacer es establecer el valor de la propiedad en una clase usando una cadena. Por ejemplo, mi clase tiene las siguientes propiedades:

myClass.Name myClass.Address myClass.PhoneNumber myClass.FaxNumber 

Todos los campos son de tipo cadena, así que sé de antemano que siempre es una cadena. Ahora quiero poder establecer las propiedades usando una cadena como lo haría con el objeto DataSet. Algo como esto:

 myClass["Name"] = "John" myClass["Address"] = "1112 River St., Boulder, CO" 

Idealmente, solo quiero asignar una variable y luego establecer la propiedad usando ese nombre de cadena de la variable

 string propName = "Name" myClass[propName] = "John" 

Estaba leyendo sobre la reflexión y tal vez es la manera de hacerlo, pero no estoy seguro de cómo configurarlo manteniendo el acceso a la propiedad intacto en la clase. Quiero poder usar aún

 myClass.Name = "John" 

Cualquier ejemplo de código sería realmente genial.

Puede agregar propiedad del indexador, un pseudocódigo :

 public class MyClass { public object this[string propertyName] { get{ // probably faster without reflection: // like: return Properties.Settings.Default.PropertyValues[propertyName] // instead of the following Type myType = typeof(MyClass); PropertyInfo myPropInfo = myType.GetProperty(propertyName); return myPropInfo.GetValue(this, null); } set{ Type myType = typeof(MyClass); PropertyInfo myPropInfo = myType.GetProperty(propertyName); myPropInfo.SetValue(this, value, null); } } } 

Agregar a cualquier Class :

 public class Foo { public object this[string propertyName] { get { return this.GetType().GetProperty(propertyName).GetValue(this, null); } set { this.GetType().GetProperty(propertyName).SetValue(this, value, null); } } public string Bar { get; set; } } 

Entonces, puedes usar como:

 Foo f = new Foo(); // Set f["Bar"] = "asdf"; // Get string s = (string)f["Bar"]; 

Fuente: Obtener el valor de la propiedad de la cadena usando la reflexión en C #

Puede agregar un indexador a su clase y usar reflection para ases las propiedades:

 using System.Reflection; public class MyClass { public object this[string name] { get { var properties = typeof(MyClass) .GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var property in properties) { if (property.Name == name && property.CanRead) return property.GetValue(this, null); } throw new ArgumentException("Can't find property"); } set { return; } } } 

Puede ser algo como esto?

  public class PropertyExample { private readonly Dictionary _properties; public string FirstName { get { return _properties["FirstName"]; } set { _properties["FirstName"] = value; } } public string LastName { get { return _properties["LastName"]; } set { _properties["LastName"] = value; } } public string this[string propertyName] { get { return _properties[propertyName]; } set { _properties[propertyName] = value; } } public PropertyExample() { _properties = new Dictionary(); } }