Как верно передать "класс" в метод?
Подскажите, пожалуйста, у меня есть два класса; (Star,Circle) Есть ли возможность передать данный класс в метод с вызовом его конструктора.
Сейчас использую дженереки, но конструктор не работает
Ошибка: CS0417 ‘T»: при создании экземпляра типа переменной не удается задать аргументы
как верно передать класс в метод заместо «new T»?
![]()
То, в каком виде пытаетесь это сделать Вы, сделать не получится.
Вы не можете наложить ограничение на T , чтобы у него обязательно был конструктор с указанными Вами типами параметров.
Данное ограничение new работает следующим образом:
Оно указывает, что аргумент любого переданного типа должен иметь открытый конструктор без параметров.
Как видите, нам это не подходит. Точнее, не совсем.
Давайте рассмотрим несколько вариантов решения Вашей проблемы
#0. Наследование
Раз Вы пытаетесь объединить объекты, значит, они явно наделены общей логикой. А общую логику в ООП принято выносить в абстракции. Давайте так и поступим!
Я не знаю деталей реализации Вашей программы, но, судя по названиям, Вы работаете с некими фигурами. Запишем все это дело так:
Теперь же давайте изменим Ваш метод:
Если же Вам нужно не просто установить значения свойств и в инициализатор спрятана какая-то хитрая логика, то метод можно переписать так:
Или же можно использовать сопоставление шаблонов из C# 7.0+ (данный вариант представлен больше для демонстрации указанных возможностей языка, чем для использования в реальных проектах):
#1. Явное обращение к рефлексии
То, что Вы хотите, можно реализовать и с помощью нашей дорогой и любимой рефлексии (однако сразу предупреждаю, что это медленнее вышеописанного подхода. Не очень заметно на малых выборках, но все же именно поэтому рекомендуется использовать варианты выше)
Метод можно порядком ужать. Я все расписываю, чтобы Вам было удобнее и понятнее читать)
Как ужать? Таким образом, используя Activator.CreateInstance:
Данный метод делает ровно то, что и предыдущий (описанный для Вашего лучшего понимания подноготной), только встроенными возможностями
С помощью рефлексии можно реализовать метод безо всякого наследования и сопоставления типов, так что метод динамически расширяем (то есть если Вы добавите еще 10 классов, реализующих указанный конструктор, Вам не придется менять данный метод для их создания, в отличие от описанных выше с помощью наследования)
Спасибо @PashaPash за поправку!
также использует рефлексию для создания объекта.
То есть данное выражение эквивалентно следующему:
Надеюсь, мой ответ помог Вам разобраться в вопросе и решил Вашу проблему!
Удачи в Ваших начинаниях!
C#. Передача параметров в метод. Аргументы и формальные параметры. Примеры передачи параметров в методы. Передача ссылки на объект класса в метод
Передача параметров в метод. Аргументы и формальные параметры. Примеры передачи параметров в методы. Передача ссылки на объект класса в метод
Содержание
- 1. Что такое аргументы и формальные параметры метода? Пример
- 2. Какие существуют способы передачи аргумента методу?
- 3. Какой способ передачи аргумента методу используется в C# по умолчанию?
- 4. Пример, который демонстрирует передачу по значению аргументов базовых типов
- 5. Как осуществляется передача в метод ссылки на объект класса. Пример
- 6. Можно ли изменить внутренние данные объекта класса в методе, которому передается ссылка на этот объект?
Поиск на других ресурсах:
1. Что такое аргументы и формальные параметры метода? Пример
Аргументы – это значения, которые передаются в метод при его вызове. Формальные параметры – это значения, которые получают значение аргументов в методе. Формальные параметры используются в методе для выполнения вычислений, операций или действий в методе.
При вызове метода значение аргументов копируются (передаются) в формальные параметры метода. Существует несколько способов передачи аргументов методу.
Пример. Демонстрируется передача аргумента целого типа в метод. Задан метод Sqr() , который получает целое число и возвращает квадрат этого числа
При вызове метода из другого кода, аргумент копируется в формальный параметр.
В вышеприведенном коде вызов метода Sqr() происходит два раза.
Первый раз значение аргумента a = 5 копируется в формальный параметр x . Производится вычисление в методе Sqr() и результат (25) возвращается из метода операцией return .
При втором вызове, точно так же, значение числа 15, которое есть аргументом, копируется в формальный параметр x . Затем происходит вычисление и результат (225) возвращается оператором return .
⇑
2. Какие существуют способы передачи аргумента методу?
В языке C# существует два основных способа передачи аргумента методу:
- передача по значению (passing by value). В этом случае значение аргумента копируется в формальный параметр метода, как описано в предыдущем пункте. При этом способе передачи, все изменения над формальным параметром, которые происходят в методе, не влияют на аргумент который использовался при вызове;
- передача по ссылке (passing by reference). В этом случае методу передается ссылка на аргумент. Таким образом, если изменить формальный параметр метода, то изменится и аргумент, который был использован при вызове метода.
⇑
3. Какой способ передачи аргумента методу используется в C# по умолчанию?
По умолчанию используется передача аргумента по значению. То есть, значение аргумента копируется в формальный параметр метода и там используется. Изменение параметра в теле метода не приводит к изменению аргумента, который передавался у метод.
⇑
4. Пример, который демонстрирует передачу по значению аргументов базовых типов
В примере демонстрируется передача аргументов таких базовых типов как int , double , char
В примере, в методах IntValue() , CharValue() , DoubleValue() изменяются значения формальных параметров внутри методов. Такое изменение не влияет на аргументы, которые передавались в эти методы.
⇑
5. Как осуществляется передача в метод ссылки на объект класса. Пример
Непосредственно объект класса в метод не передается. Однако в метод передается ссылка на объект. Как и в случае с базовыми типами, при передаче ссылки на объект в метод, происходит копирование этой ссылки в формальный параметр метода. Значит, формальный параметр в методе содержит точно такое же значение как и аргумент, который передавался методу.
Пример. Передается объект класса Triangle в метод. Класс Triangle реализует треугольник, который задан координатами точек. В методе Perimeter класса Triangle реализуется вычисление периметра треугольника.
Как видно из вышеприведенного кода, метод Perimeter() получает входным параметром ссылку T на объект класса Triangle . Сама ссылка передается по значению. С помощью ссылки T можно доступиться к методам и данным (полям) класса Triangle .
Использование класса Triangle и вызов метода Perimeter() из другого программного кода может быть следующим:
В вышеприведенном коде объявляется ссылка с именем tr на объект класса Triangle . Затем эта ссылка передается в метод Perimeter() для вычисления периметра.
⇑
6. Можно ли изменить внутренние данные объекта класса в методе, которому передается ссылка на этот объект?
Да можно. Если методу передается ссылка на объект, то эта ссылка (аргумент) копируется в формальный параметр. Ведь и аргумент и формальный параметр указывают на один и тот же объект. Поэтому с помощью формального параметра метода (ссылки) можно изменять данные объекта который передавался в метод.
Например. Объявляется класс DemoInt , в котором есть:
- внутренняя переменная t ;
- метод Change100() , который получает ссылку на класс DemoInt . В методе Change100() значение внутренней переменной t входного формального параметра изменяется на 100.
С целью демонстрации, в функции Main() класса Program выполняются следующие действия:
Как передать экземпляр класса в качестве параметра методу в С#
У меня есть требование установить свойство для клиентского приложения из ссылки dll.
техническая часть, поясненная ниже.
У меня есть экземпляр класса
Я отправляю это методу в качестве параметра, который находится в другой сборке.
поэтому в ссылочной сборке мне нужно установить значения в экземпляр, чтобы он мог быть доступен из приложения.
Может ли кто-нибудь дать предложение о том, как установить свойства для экземпляра класса, переданного в качестве параметра для метода.
Здесь я добавляю то, что я пытался, но не так.: — (
Так как экземпляр класса будет проходить во время выполнения, я не могу предоставить имя класса как тип данных.
Я получаю ошибку в строке
Ну, прежде всего, вы не правильно передаете параметр callmethod , так как он ожидает ссылочный параметр, вам нужно использовать ключевое слово ref , например.
Затем в callmethod , измените свою первую строку на:
Type.GetType требуется string представление типа, а не фактический экземпляр объекта. Затем, наконец, обновите вызов SetValue , чтобы использовать экземпляр объекта, а не тип, например.
Первая строка неверна. Статический метод Type.GetType(. ) ожидает строку, которая сообщает, какой тип загружать, а не экземпляр самого типа. Однако, поскольку у вас есть экземпляр, вы можете вызвать obj.GetType(), который делает то, что вы пытаетесь сделать.
Третья строка также неверна. Первым параметром SetValue должен быть экземпляр, который вы хотите изменить, а не тип. Кроме того, вам не нужен третий параметр, потому что есть еще одна перегрузка SetValue, для которой нужны только первые два параметра. Попробуйте изменить это на:
Uhm. это не просто:
Я вижу, что вы положили test obj = new test(); в определение класса — почему?
Кроме того, в С# все имена классов должны использовать CamelCase. Я бы переписал определение класса таким образом:
Использование callmethod (которое должно быть названо callmethod , но я отвлекся) будет выглядеть примерно так:
передать класс как параметр для метода в java
Я пытаюсь создать метод, который создает новый объект класса, но я хочу иметь возможность создавать объекты многих разных классов, поэтому создание метода для каждого класса не сработает для меня. Есть ли способ передать класс методу, чтобы можно было создать новый объект? Все мои классы имеют один и тот же конструктор.
задан 14 июн ’12, 22:06
Какие? Разве это не то, что конструктор используется для? — Ryan
6 ответы
Вы можете использовать
и назовите это как
Если вы сделаете это таким образом, классы, которые вы хотите создать, должны иметь конструктор по умолчанию без аргументов. В противном случае вы поймаете java.lang.InstantiationException .
ответ дан 22 апр.

Кстати, я не думаю, что отражение — хороший способ сделать вашу архитектуру, если у вас много классов с одним и тем же конструктором, попробуйте использовать полезные шаблоны, такие как Factory или Builder, вместо создания одного метода с отражением.
Спасибо! Я не понимал большую часть этого, потому что я новичок в программировании, но я понял достаточно, чтобы знать, что делать, и мой код работает! — Лолмистер
И это проблема, попробуйте попросить какого-нибудь опытного (местного) java-программиста помочь вам создать дизайн, потому что ответ sp00m вам поможет, но это не ХОРОШАЯ идея, но решать вам. — Сергей Загрийчук
Вы можете использовать отражение в switch на имя типа и делать то, что вы должны сделать.