Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как вызвать функцию с помощью переменной? C#

Кирилл Крючков Ученик (104), открыт 4 дня назад
Я не понимаю как вызвать функция с помощью переменной. Вот пример.
 string name = "say"

name()

void say()
{
//написать привет
}
Что-бы функция say() выполнялась и в компиляторе было "привет", а не выдавало ошибку :(
6 ответов
Максим Искусственный Интеллект (215515) 4 дня назад
Это так не делается, Name это должен быть метод, а не переменная. Если ты хочешь обращаться к методу по имени из переменной, то нужно пользоваться reflection. В большинстве случаев такой подход стоит избегать в пользу более традиционных вариантов ООП через абстракции: интерфейс, наследование и т.п.
AliExpress Знаток (446) 4 дня назад
var say = () => Console.WriteLine("hello");
say();

или
var a = say;
a();
void say()
{
Console.WriteLine("hello world");
}
Андрей Высший разум (468298) 4 дня назад
Трюки с указанием имени функции как текстовой строки работают в некоторых интерпретируемых языках. Но в компилируемом языке переменной присваивают не имя функции, а указатель на функцию. В C# это называется "делегаты": https://learn.microsoft.com/ru-ru/dotnet/csharp/programming-guide/delegates/
Лев Перфилов Просветленный (31227) 4 дня назад
Через лямбда-функцию:
 void say(string param) 
{
Console.WriteLine(param);
}
Action name = () => say("привет");
name();
Через делегат:
 public delegate void Callback(string param);
void say(string param)
{
Console.WriteLine(param);
}
Callback name = say;
name("привет");
Def Гений (64432) 4 дня назад
Через рефлексию

 using System; 
using System.Reflection;
public class HelloWorld
{

public void say()
{
Console.WriteLine("Hello");
}

public static void Main(string[] args)
{
Type thisType = Type.GetType("HelloWorld");
ConstructorInfo thisCtr = thisType.GetConstructor(Type.EmptyTypes);
object thisExample = thisCtr.Invoke(new object[] { });
MethodInfo sayMethod = thisType.GetMethod("say");
if (sayMethod != null)
{
sayMethod.Invoke(thisExample, null);
}
else
{
Console.WriteLine("Cannot find method say()!!!");
}
}
}
Jurijus Zaksas Искусственный Интеллект (451907) 4 дня назад
Просто подытожу все вышесказанное.

  1. Вызвать метод по его имени можно через рефлексию. Но так дела не делаются. Можешь по коду сверху посмотреть, какой это костыль.
  2. Если тебе нужно передать метод как параметр, нужно использовать делегаты.
  3. Почитай про делегаты, лямбда-выражения и анонимные блоки. А еще до кучи - про интерфейсы. Скорее всего, тебе будет достаточно этих средств, и рефлексия не понадобится.
Похожие вопросы