with propertytype property name getvalue from c# reflection propertyinfo

propertytype - reflection c#



¿Cómo establecer valores en la propiedad anidada utilizando Reflexión de C#? (2)

Debería llamar a PropertyInfo.GetValue usando la propiedad Country para obtener el país, luego a PropertyInfo.SetValue usando la propiedad Id para establecer la ID en el país.

Así que algo como esto:

public void SetProperty(string compoundProperty, object target, object value) { string[] bits = compoundProperty.Split(''.''); for (int i = 0; i < bits.Length - 1; i++) { PropertyInfo propertyToGet = target.GetType().GetProperty(bits[i]); target = propertyToGet.GetValue(target, null); } PropertyInfo propertyToSet = target.GetType().GetProperty(bits.Last()); propertyToSet.SetValue(target, value, null); }

Estoy tratando de establecer un valor en una propiedad de clase anidada dinámicamente utilizando la reflexión. ¿Podría alguien ayudarme a hacer esto?

Estoy teniendo una Region clase como abajo.

public class Region { public int id; public string name; public Country CountryInfo; } public class Country { public int id; public string name; }

Tengo un lector de datos de Oracle para proporcionar los valores del cursor de referencia.

que me dara como

Id, nombre, Country_id, Country_name

Pude asignar los valores a Region.Id, Region.Name por debajo.

FieldName="id" prop = objItem.GetType().GetProperty(FieldName, BindingFlags.Public | BindingFlags.Instance); prop.SetValue(objItem, Utility.ToLong(reader_new[ResultName]), null);

Y para la propiedad anidada pude hacer los valores asignados a la siguiente manera creando una instancia leyendo el nombre de campo.

FieldName="CountryInfo.id" if (FieldName.Contains(''.'')) { Object NestedObject = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split(''.'')[0]), BindingFlags.Public | BindingFlags.Instance); //getting the Type of NestedObject Type NestedObjectType = NestedObject.GetType(); //Creating Instance Object Nested = Activator.CreateInstance(typeNew); //Getting the nested Property PropertyInfo nestedpropinfo = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split(''.'')[0]), BindingFlags.Public | BindingFlags.Instance); PropertyInfo[] nestedpropertyInfoArray = nestedpropinfo.PropertyType.GetProperties(); prop = nestedpropertyInfoArray.Where(p => p.Name == Utility.Trim(FieldName.Split(''.'')[1])).SingleOrDefault(); prop.SetValue(Nested, Utility.ToLong(reader_new[ResultName]), null); Nestedprop = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split(''.'')[0]), BindingFlags.Public | BindingFlags.Instance); Nestedprop.SetValue(objItem, Nested, null); }

Lo anterior asigna valores a Country.Id .

Pero ya que estoy creando una instancia todas y cada una de las veces, no pude obtener el valor de Country.Id anterior si voy por el Next Country.Name.

¿Alguien podría decir que podría asignar valores a objItem(that is Region).Country.Id y objItem.Country.Name ? Lo que significa cómo asignar valores a las Propiedades anidadas en lugar de crear una instancia y asignar cada vez.

Gracias por adelantado.!


Obtener propiedades Nest por ejemplo, Developer.Project.Name

private static System.Reflection.PropertyInfo GetProperty(object t, string PropertName) { if (t.GetType().GetProperties().Count(p => p.Name == PropertName.Split(''.'')[0]) == 0) throw new ArgumentNullException(string.Format("Property {0}, is not exists in object {1}", PropertName, t.ToString())); if (PropertName.Split(''.'').Length == 1) return t.GetType().GetProperty(PropertName); else return GetProperty(t.GetType().GetProperty(PropertName.Split(''.'')[0]).GetValue(t, null), PropertName.Split(''.'')[1]); }