Как установить Vaues в вложенное свойство с помощью С# Reflection.?
Я пытаюсь установить значение вложенное свойство класса динамически с использованием отражения. Может ли кто-нибудь помочь мне сделать это.
У меня есть класс Region
, как показано ниже.
public class Region
{
public int id;
public string name;
public Country CountryInfo;
}
public class Country
{
public int id;
public string name;
}
У меня есть считыватель данных Oracle для предоставления значений из курсора Ref.
который даст мне как
Id, имя, COUNTRY_ID, COUNTRY_NAME
Я смог присвоить значения Region.Id, Region.Name ниже.
FieldName="id"
prop = objItem.GetType().GetProperty(FieldName, BindingFlags.Public | BindingFlags.Instance);
prop.SetValue(objItem, Utility.ToLong(reader_new[ResultName]), null);
И для вложенного свойства я смог выполнить значения назначений следующим образом, создав экземпляр, прочитав поле "Имя поля".
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);
}
Приведенные выше значения присваиваются Country.Id
.
Но так как я создаю экземпляр каждый раз, когда я не смог получить предыдущее значение Country.Id
, если я перейду к следующей стране .Name.
Может ли кто-нибудь сказать, может назначить значения objItem(that is Region).Country.Id
и objItem.Country.Name
. Это означает, как назначать значения вложенным свойствам вместо создания экземпляра и назначения каждый раз.
Спасибо заранее.!
Ответы
Ответ 1
Вы должны называть PropertyInfo.GetValue
с помощью свойства Country
для получения страны, а затем PropertyInfo.SetValue
с помощью свойства Id
для установки идентификатора в стране.
Так что-то вроде этого:
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);
}
Ответ 2
Получить свойства Nest, например 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]);
}