Рекурсивное создание экземпляров классов внутри объектаC#

Место общения программистов C#
Ответить
Anonymous
 Рекурсивное создание экземпляров классов внутри объекта

Сообщение Anonymous »

Я хочу автоматически и рекурсивно активировать посредством отражения все вложенные классы внутри класса, экземпляр которого я создаю. Вот шаблон того, что я пытаюсь сделать, но не знаю, как создать эту функцию. Я знаю, как перечислять члены и создавать экземпляры, но не знаю, как присвоить их внутренним подтипам. Вот такая схема. Мне нужно сделать это путем размышления, не внося никаких изменений внутри исходного класса. Просто активация объектов внутри, снаружи. Никаких переписываний кода внутри класса или добавления различных «новых» внутри класса, очевидно

Код: Выделить всё

        void someCode()
{
Nest MyNest = new Nest();
createInstancesOfAllClassesInside(MyNest);
}

void createInstancesOfAllClassesInside(object anyObj)
{
//How, using reflection ?
}

public class Nest
{
public class A
{
public class A1
{
public class A2
{
public string x = "Activate me!";
}
}
}
public class B
{
public class B1
{
}
}
public string s = "Hello";
}
Отвечая на комментарии: под активацией я имею в виду «как если бы» внутренние классы были созданы с помощью new(). Спасибо!
Я добавлю свою (нерабочую) попытку далеко, чтобы проблема стала понятнее:

Код: Выделить всё

public void createInstancesOfAllClassesInside(object obj)
{

var objType = obj.GetType();

foreach (MemberInfo member in objType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
if (member is Type && ((Type)member).IsNested)
{
var instance = Activator.CreateInstance((Type)member);

// here i do not know how to assign to the member!

var propInfo = objType.GetProperty(member.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (propInfo is not null)
{
propInfo.SetValue(obj, instance, (object[])null);
}

}
}

}
Я создал экземпляры, но не смог найти способ «SetValue», то есть назначить сгенерированный экземпляр (через активатор) соответствующему элементу.
Вот пример класса, которому может потребоваться такая обработка:

Код: Выделить всё

 public class _CONST
{
public class FOLDERS_APP
{
public class POSTS
{
public const string FOLDER_POSTS_USERS = "somefolder1/";
public const string FOLDER_PRO_POSTS_FROM_USERS = "somefolder2/";
public const string FOLDER_FOR_IM_IN_POST = "somefolder3/";
public const string FOLDER_ATTACH_TO_POSTS = "somefolder4/";
}
public class MANIFESTOS
{
public const string FOLDER_APPLICATION_MO = "somefolder5/";
public const string FOLDER_FOM_S = "somefolder6/";
}
}
}
В этом случае при создании экземпляра основного класса внутренние классы не создаются. Моя цель — также создать их экземпляры [без редактирования класса и добавления экземпляров], потому что они нужны мне для процесса сериализации. В противном случае сериализатор не будет их учитывать (они будут пропущены). То есть мои константы не будут отправлены клиенту, а только те, которые находятся во внешнем классе (скажем, первый уровень констант, которые я отправляю).

Подробнее здесь: https://stackoverflow.com/questions/790 ... -an-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»