Инициализация вложенных сложных типов с использованием Reflection - PullRequest
0 голосов
/ 24 сентября 2011

Кодовое дерево имеет вид:

Class Data
{
    List<Primitive> obj;
}

Class A: Primitive
{
    ComplexType CTA;
}

Class B: A
{
    ComplexType CTB;
    Z o;
}

Class Z
{
   ComplexType CTZ;
}

Class ComplexType { .... }

Теперь в List<Primitive> obj есть много классов, в которых ComplexType object равен 'null'.Я просто хочу инициализировать это некоторым значением.

Проблема заключается в том, как обойти полное дерево, используя отражение.

Редактировать:

Data data = GetData(); //All members of type ComplexType are null. 
ComplexType complexType = GetComplexType();

Мне нужно инициализировать все члены 'ComplexType' в 'data' для 'complexType'

1 Ответ

2 голосов
/ 24 сентября 2011

Если я вас правильно понимаю, возможно, что-то подобное поможет:

static void AssignAllComplexTypeMembers(object instance, ComplexType value)
{
     // If instance itself is null it has no members to which we can assign a value
     if (instance != null)
     {
        // Get all fields that are non-static in the instance provided...
        FieldInfo[] fields = instance.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

        foreach (FieldInfo field in fields)
        {
           if (field.FieldType == typeof(ComplexType))
           {
              // If field is of type ComplexType we assign the provided value to it.
              field.SetValue(instance, value);
           }
           else if (field.FieldType.IsClass)
           {
              // Otherwise, if the type of the field is a class recursively do this assignment 
              // on the instance contained in that field. (If null this method will perform no action on it)
              AssignAllComplexTypeMembers(field.GetValue(instance), value);
           }
        }
     }
  }

И этот метод будет называться как:

foreach (var instance in data.obj)
        AssignAllComplexTypeMembers(instance, t);

Этот код, конечно, работает только для полей. Если вам также нужны свойства, вам нужно будет выполнить цикл по всем свойствам (который можно получить с помощью instance.GetType().GetProperties(...)).

Имейте в виду, что это отражение не особенно эффективно.

...