Рекурсивное создание экземпляров классов внутри объекта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();

// Loop through all nested types inside the object's type
foreach (Type nestedType in objType.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic))
{

// Create an instance of the nested type
var instance = Activator.CreateInstance(nestedType);

// cant find something like: SetValue(obj, instance) to attach the object to its container !

// Recursively call the function to instantiate nested classes inside this instance
CreateInstancesOfAllClassesInside(instance);
}

}

public void CreateInstancesOfAllClassesInside2(ref object obj)
{

var objType = obj.GetType();

// Loop through all nested types inside the object's type
foreach (Type nestedType in objType.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic))
{
// Create an instance of the nested type using its constructor
var instance = Activator.CreateInstance(nestedType);

// Recursively instantiate any further nested classes inside this instance
CreateInstancesOfAllClassesInside2(ref instance);

// Now invoke the constructor of the nested type to ensure proper initialization
ConstructorInfo[] ctors = nestedType.GetConstructors();
if (ctors.Length > 0)
{
ctors[0].Invoke(instance, (object[])null); // Call the constructor
}

// instances of nested classes do not appear in the object root!  :-(

}

}
Я создал экземпляры, но не смог найти способ «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#»