Получить все свойства объекта, которые лежат в основе объекта

    class Employee
    {
        public string EmployeeId;
        public UserGroup[] UserGroups;
        public Department Department;
        public List<Address> Address;
    }
    class UserGroup
    {
        public int GroupId;
        public string GroupName;
        public string UserName;
        public string Password;
    }
    public class Department
    {
        public int DeptId;
        public string DeptName;
    }
    public class Address
    {
        public string Street;
        public string ZipCode;
        public decimal Latitude;
        public decimal Longitude;
    }
    /// <summary>
    /// This method should loop and read all the properties of Employee object and and assign value to that property
    /// Ex: if propertyName is EmployeeId, propertyValue must be assigned to it.
    /// Ex: if propertyName is GroupName, propertyValue must be assigned to it.
    /// Ex: if propertyName is DeptName, propertyValue must be assigned to it.
    /// Ex: if propertyName is Latitude, propertyValue must be assigned to it.
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="propertyName"></param>
    /// <param name="propertyValue"></param>
    public static AssignValueToProperty(Employee obj, string propertyName, string propertyValue)
    {
        //Implementation Pending
    }

Имея объект Employee, PropertyName и PropertyValue, я должен иметь возможность перебирать все свойства его внутренних объектов и присваивать значения этому свойству. Может ли кто-нибудь помочь мне в этом? Заранее спасибо.


person Sri    schedule 24.06.2016    source источник


Ответы (1)


Мы можем получить доступ к свойствам объекта, используя отражение в C#.NET, а также значения get и set для этого свойства.

Я думаю, вы ищете что-то вроде этого.

Учитывая ваш данный объект Employee, который

    class Employee
    {
        public string EmployeeId;
        public UserGroup[] UserGroups;
        public Department Department;
        public List<Address> Address;
    }

Вы хотите просмотреть все свойства объекта. Вы можете сделать это следующим образом:

Employee objEmp = new Employee();

//loop

foreach(var property in objEmp.GetType().GetProperties())
{
   AssignValueToProperty(objEmp, property.Name, "{Your Value}");
}

Тогда в вашем методе AssignValueToProperty у вас будет что-то вроде

public static AssignValueToProperty(Employee obj, string propertyName, string propertyValue)
{
    objEmp.GetType().GetProperty(propertyName).SetValue(objEmp, propertyValue, null);
}

Кроме того, я хотел бы добавить, что у вас есть структура объекта, имеющая такие свойства, как UserGroup[] UserGroups, где UserGroup - это другой объект. Вам не кажется, что ваш метод AssignValueToProperty здесь не сработает, потому что он принимает значения свойств в виде строкового типа данных, в то время как у вас есть разные типы данных в вашем объекте Employee. Итак, все, что вам нужно сделать, это перебрать несколько свойств объектов, как указано выше, и, наконец, установить их в объект сотрудника.

Вы также можете установить объект, проверив их datatypes. т.е.

foreach(var property in objEmp.GetType().GetProperties())
{
   // Get PropertyType
   string datatype = property.PropertyType.Name;
   // Apply conditions on the datatype basis
   if (datatype.Equals("string") && property.Name.Equals("EmployeeId"))
   {
      // assign string values
      objEmp.GetType().GetProperty(property.Name).SetValue(objEmp, "{your string value}", null);
   }
   else if (datatype.Equals("UserGroup") && property.Name.Equals("UserGroups"))
   {
      // assign object value
      objEmp.GetType().GetProperty(property.Name).SetValue(objEmp, "{your UserGroup Object}", null);
   }
   // so on other properties
}
// And Finally Use `objEmployee` with all properties values set.

БОНУС

Вы также можете найти и установить свойство, используя лямбда-выражение, например следующее:

objEmp.GetType().GetProperties().Where(x => x.Name.Equals("{PropertyName}") && x.PropertyType.Name.Equals("{Target datatype}")).FirstOrDefault().SetValue({Your Object}, {Your Value}, null);

В случае, если вам нужно создать объект класса во время выполнения, определение метода будет следующим:

public static AssignValueToProperty(string obj, string propertyName, string propertyValue)
{
    Type type = Type.GetType(obj, true);
    object objEmp = Activator.CreateInstance(type);
    objEmp.GetType().GetProperty(propertyName).SetValue(objEmp, propertyValue, null);
}

Надеюсь, это поможет... :)

person Asad Ali    schedule 27.06.2016
comment
В этом сценарии будет четыре функции для четырех классов, созданных Шри. Есть ли способ обработать все эти классы с помощью одного метода. Я имею в виду, что мы не ограничиваем класс Employee в методе AssignValueToProperty и используем этот метод для всех классов. - person Ahmad Chishti; 14.09.2017
comment
Согласно моим предположениям, вы хотите написать динамическую функцию, с помощью которой мы можем создать экземпляр любого класса в пространстве имен и установить его свойства посредством отражения, как мы уже делали выше. Для этого вы можете попробовать Type type = Type.GetType(Employee, true);object objEmp = Activator.CreateInstance(type); Надеюсь, это поможет. - person Asad Ali; 14.09.2017
comment
Я обновил свой ответ и добавил новое определение метода. - person Asad Ali; 14.09.2017