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]);
}