Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410

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

02.10.2019, 14:07. Показов 6529. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужно как то создать экземпляр объекта динамического типа (типа, хранящегося в переменной типа Type), при этом не вызывая конструктор, но что бы базовые значения, прописанные в классе, присвоились, поясняю:
C#
1
2
3
4
5
6
7
8
9
public class SomeClass
{
    public string someStr = "abc";
    public int value { get; set; } = 2;
    public SomeClass(string str, SomeClass cl2)
    {
        someStr = "someActualValue";
    }
}
после (каким либо способом) создания экземпляра такого класса в объекте должны лежать someStr со значением "abc" и value со значением 2, Activator.CreateInstance не сработает, ибо он вызывает конструктор, а мне надо не вызывать (не от меня зависит какие будут конструкторы у потенциальных классов, все учесть невозможно, а создавать экземпляры надо), а FormatterServices.GetUninitializedObject не подойдёт, потому что в someStr будет null и в value 0, идеи?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.10.2019, 14:07
Ответы с готовыми решениями:

Передача имени класса и создание экземпляра соответствующего объекта
Добрый день! В моем приложении часто используется код: if (!Dialogs.connectedToDB()) return; ImportForm imvf...

Создание экземпляра объекта
Добрый день. Создал при помощи Эклипс класс: public class Car { public final static String color="красный"; ...

Создание экземпляра объекта с параллельным созданием таблицы бд
Здравствуйте, хочу сделать так, чтобы при создании экземпляра класса, сразу создавалась таблица в базе с именем как у экземпляра. Например:...

23
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
02.10.2019, 14:32
а чем не устраивает вариант с вызовом конструктора и последующим изменением нужных свойств/полей?
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
02.10.2019, 14:40  [ТС]
Тем, что я не знаю какой будет конструктор, а он может быть какой угодно, я же написал, что не от меня зависит какой у создаваемого экземпляра будет конструктор.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.10.2019, 14:52
Цитата Сообщение от Nordicus666 Посмотреть сообщение
но что бы базовые значения, прописанные в классе, присвоились,
это конечно удобная формулировка при наличии исходного кода, но сформулируйте задачу для вот этого примера:
C#
1
2
3
4
5
6
7
8
9
10
11
        public class SomeClass
        {
            public string someStr;
            public int value { get; set; }
            public SomeClass(string str, SomeClass cl2)
            {
                someStr = "abc";
                value = 2;
                someStr = "someActualValue";
            }
        }
(вам все еще надо получить 2 в value и "abc" в someStr)
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
02.10.2019, 15:01  [ТС]
в таком примере не нужно, ибо конструктор вызваться и не должен, а базовые значения (если я ошибаюсь термином - поправьте, но тут я имею ввиду то что пишется сразу после объявления переменной) отсутствуют, соответственно в них "abc" и 2 не должно быть и не будет
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.10.2019, 15:02
Цитата Сообщение от Nordicus666 Посмотреть сообщение
не от меня зависит какой у создаваемого экземпляра будет конструктор.
Значит с каждым типом должна поставляться фабрика, которая знает, какие у класса конструкторы и что в них передавать.
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
02.10.2019, 15:03  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Значит с каждым типом должна поставляться фабрика, которая знает, какие у класса конструкторы и что в них передавать.
тогда я буду обязывать любого случайного пользователя писать эту фабрику для каждого своего класса с конструктором, неплохо, да? Юнити же сделал описанное в вопросе, значит это возможно.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.10.2019, 15:06
Цитата Сообщение от Nordicus666 Посмотреть сообщение
в таком примере не нужно
а это ваш исходный пример в скомпилированном виде, так что еще как нужно

Добавлено через 2 минуты
на самом деле есть очень упоротый способ это сделать, но он вам не понравится

Цитата Сообщение от Nordicus666 Посмотреть сообщение
Юнити же сделал описанное в вопросе
уверен, там такого нет. Вы придумали себе странное решение типовой задачи. начните с постановки самой задачи, а мы поможем с решением
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
02.10.2019, 15:08  [ТС]
ну а что, юнити тогда код читает и подставляет значения что ли? я и сам не понимаю как это сделать, я сюда и пришёл за ответом, я просто озвучил результаты экспериментов и ищу способ повторить их действие

Добавлено через 1 минуту
ответ найден, тема закрыта, юнити видимо юзает рефлексию после создания объекта с помощью FormatterServices, по крайней мере результат тот же
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.10.2019, 15:10
Цитата Сообщение от Nordicus666 Посмотреть сообщение
я сюда и пришёл за ответом
а вместо того, чтобы описать задачу, описали неправильное решение. Мы можем только догадываться, что вам там понадобилось.

Цитата Сообщение от Nordicus666 Посмотреть сообщение
тогда я буду обязывать любого случайного пользователя писать эту фабрику для каждого своего класса с конструктором, неплохо, да?
обяжите писать дефолтный конструктор, это вполне себе типовое обязательство, тем более что оно и так практически готово, нужен только пустой конструктор
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.10.2019, 15:10
Цитата Сообщение от Nordicus666 Посмотреть сообщение
тогда я буду обязывать любого случайного пользователя писать эту фабрику для каждого своего класса с конструктором, неплохо, да?
Да, вполне хорошо.

Цитата Сообщение от Nordicus666 Посмотреть сообщение
Юнити же сделал описанное в вопросе
Я с Юнити не работал, потому не могу сказать что они там сделали, но навеврняка либо фабрику, либо метод инициализации, либо ограничение на сигнатуру конструктора.
Ну или какой-нибудь совсем уж адов костыль.

Можете показать пример, как это работает в Юнити?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.10.2019, 15:11
Цитата Сообщение от Nordicus666 Посмотреть сообщение
юнити видимо юзает рефлексию после создания объекта с помощью FormatterServices
еще раз, рефлексия так не умеет. Можете верить в свои догадки или в документацию
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
02.10.2019, 15:16  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
еще раз, рефлексия так не умеет. Можете верить в свои догадки или в документацию
а вот у меня почему то сумела:
C#
1
2
3
4
5
6
7
8
9
10
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha7))
        {
            SomeClass sc = new SomeClass();
            Debug.Log(sc.value);
            typeof(SomeClass).GetField("value").SetValue(sc, 4);
            Debug.Log(sc.value);
        }
    }
C#
1
2
3
4
5
public class SomeClass
{
    public string someStr = "abc";
    public readonly int value = 2;
}
при нажатии семёрки в выводе 2, затем 4, это так же сработало и с переменной public int value { get; private set; }
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.10.2019, 15:18
Цитата Сообщение от Nordicus666 Посмотреть сообщение
а вот у меня почему то сумела:
ну тут и конструктор вызвался, какие вопросы.
пропишите в конструкторе value = 42 и получите 42 вместо 2
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
02.10.2019, 15:22  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Можете показать пример, как это работает в Юнити?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class obj1 : MonoBehaviour
{
    public string value = "someValue";
    public obj1(string someRandomArg1, string someRandomArg2)
    {
        Debug.Log("Constructor called");
        value = "someOtherValue";
    }
    public void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
            Debug.Log(value);
    }
}
вот компонент, "constructor called" не выводит, при том когда нажимаешь единицу - выводит "someValue"

Добавлено через 2 минуты
Цитата Сообщение от КОП Посмотреть сообщение
ну тут и конструктор вызвался, какие вопросы.
пропишите в конструкторе value = 42 и получите 42 вместо 2
это был пример возможностей рефлексии, вот пример без вызова конструктора, если вам критично:
C#
1
2
3
4
5
6
7
8
9
10
void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha7))
        {
            SomeClass sc = (SomeClass)FormatterServices.GetUninitializedObject(typeof(SomeClass));
            Debug.Log(sc.value);
            typeof(SomeClass).GetField("value").SetValue(sc, 4);
            Debug.Log(sc.value);
        }
    }
C#
1
2
3
4
5
public class SomeClass
{
    public string someStr = "abc";
    public readonly int value = 2;
}
в выводе 0, затем 4
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
02.10.2019, 15:25
Лучший ответ Сообщение было отмечено Lexeq как решение

Решение

Не проще создать 2 конструктора, по умолчанию и с параметрами, чем заниматься этими извращениями с рефлексией?
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
02.10.2019, 15:28  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Не проще создать 2 конструктора, по умолчанию и с параметрами, чем заниматься этими извращениями с рефлексией?
Если юнити это смог сделать, то значит это возможно, я пока что нашёл вариант через рефлексию, а вот обязывать пользователя что то лишний раз делать без смысла для него - плохая идея
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.10.2019, 15:28
Цитата Сообщение от Nordicus666 Посмотреть сообщение
это был пример возможностей рефлексии
я прекрасно знаю возможности рефлексии, а вы пальцем в небо тычете
Цитата Сообщение от Nordicus666 Посмотреть сообщение
в выводе 0, затем 4
так вам же 2 и 4 надо без вызова конструктора с помощью рефлексии, вот и покажите это (спойлер: рефлексия так не может)

вот ваш пример, проинициализируйте someclass с помощью рефлексс так, чтобы вывод содержал только 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public class SomeClass
        {
            public int value = 2;
 
            public SomeClass()
            {
                Console.WriteLine("constructor");
                this.value = 42;
            }
        }
 
        public static void Main(string[] args)
        {
            SomeClass sc = //???
            Console.WriteLine(sc.value);
        }
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
02.10.2019, 15:30
Цитата Сообщение от Nordicus666 Посмотреть сообщение
а вот обязывать пользователя что то лишний раз делать без смысла для него - плохая идея
По моему инициализировать поля значениями по умолчанию через конструктор вполне себе нормальная практика...
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
02.10.2019, 15:38
Цитата Сообщение от Someone007 Посмотреть сообщение
По моему инициализировать поля значениями по умолчанию через конструктор вполне себе нормальная практика...

Не по теме:

Аминь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.10.2019, 15:38
Помогаю со студенческими работами здесь

Как создать класс не вызывая конструктор
Всем привет, кто знает как создать новый экземпляр класса не вызывая конструктор?

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

Конструктор и создание объекта в main
Уважаемые форумчане, помогите распутаться в 3-х соснах. Пожалуйста. Для наглядности, имеем код: import java.util.*; class...

Конструктор. Создание нового объекта
Всем привет, Пишу программу "Мой сборник CD". Как можно создавать объекты не вводя их количество в начале программы? Например, если...

Создание объекта и передача аргументов в конструктор
Всем привет, такой вопрос что делает следующая строчка : new NewClass(5); Прошу обратить внимание не вот этот код: NewClass obj = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru