параметра - передача параметров по ссылке c#




Метод передачи в качестве параметра с использованием C# (7)

Вам нужно использовать делегат . В этом случае все ваши методы принимают string параметр и возвращают int - это наиболее просто представлено Func<string, int> delegate 1 . Таким образом, ваш код может стать правильным с таким простым изменением, как это:

public bool RunTheMethod(Func<string, int> myMethodName)
{
    // ... do stuff
    int i = myMethodName("My String");
    // ... do more stuff
    return true;
}

По правде говоря, у делегатов гораздо больше власти. Например, с C # вы можете создать делегат из выражения лямбда , чтобы вы могли вызвать ваш метод таким образом:

RunTheMethod(x => x.Length);

Это создаст анонимную функцию:

// The <> in the name make it "unspeakable" - you can't refer to this method directly
// in your own code.
private static int <>_HiddenMethod_<>(string x)
{
    return x.Length;
}

а затем передать этот делегат методу RunTheMethod .

Вы можете использовать делегаты для подписки на события, асинхронное выполнение, обратные вызовы - всевозможные вещи. Стоит их прочитать, особенно если вы хотите использовать LINQ. У меня есть article которая в основном касается различий между делегатами и событиями, но в любом случае вы можете найти ее полезной.

1 Это основано только на общий тип делегата Func<T, TResult> в структуре; вы можете легко заявить о себе:

public delegate int MyDelegateType(string value)

и затем вместо параметра make будет иметь тип MyDelegateType .

У меня есть несколько методов с одной и той же сигнатурой (параметры и возвращаемые значения), но разные имена и внутренности методов разные. Я хочу передать имя метода для запуска к другому методу, который будет вызывать переданный метод.

public int Method1(string)
{
    ... do something
    return myInt;
}

public int Method2(string)
{
    ... do something different
    return myInt;
}

public bool RunTheMethod([Method Name passed in here] myMethodName)
{
    ... do stuff
    int i = myMethodName("My String");
    ... do more stuff
    return true;
}

public bool Test()
{
    return RunTheMethod(Method1);
}

Этот код не работает, но это то, что я пытаюсь сделать. Я не понимаю, как написать код RunTheMethod, так как мне нужно определить параметр.


Вот пример, который поможет вам лучше понять, как передать функцию в качестве параметра.

Предположим, у вас есть родительская страница, и вы хотите открыть всплывающее окно для ребенка. На родительской странице есть текстовое поле, которое должно быть заполнено на основе текстового поля дочернего всплывающего окна.

Здесь вам нужно создать делегат.

Parent.cs // Объявление делегатов public delegate void FillName (String FirstName);

Теперь создайте функцию, которая заполнит ваше текстовое поле, а функция должна отображать делегаты

//parameters
public void Getname(String ThisName)
{
     txtname.Text=ThisName;
}

Теперь при нажатии кнопки вам нужно открыть всплывающее окно Child.

  private void button1_Click(object sender, RoutedEventArgs e)
  {
        ChildPopUp p = new ChildPopUp (Getname) //pass function name in its constructor

         p.Show();

    }

В конструкторе ChildPopUp вам необходимо создать параметр «тип делегата» родительской // страницы

ChildPopUp.cs

    public  Parent.FillName obj;
    public PopUp(Parent.FillName objTMP)//parameter as deligate type
    {
        obj = objTMP;
        InitializeComponent();
    }



   private void OKButton_Click(object sender, RoutedEventArgs e)
    {


        obj(txtFirstName.Text); 
        // Getname() function will call automatically here
        this.DialogResult = true;
    }

Вы можете использовать делегат Func в .net 3.5 в качестве параметра в методе RunTheMethod. Делегат Func позволяет указать метод, который принимает несколько параметров определенного типа и возвращает один аргумент определенного типа. Вот пример, который должен работать:

public class Class1
{
    public int Method1(string input)
    {
        //... do something
        return 0;
    }

    public int Method2(string input)
    {
        //... do something different
        return 1;
    }

    public bool RunTheMethod(Func<string, int> myMethodName)
    {
        //... do stuff
        int i = myMethodName("My String");
        //... do more stuff
        return true;
    }

    public bool Test()
    {
        return RunTheMethod(Method1);
    }
}

Вы также можете попробовать Action Delegate!

 public static int Method1(string mystring)
 {
      return 1;
 }

 public static int Method2(string mystring)
 {
     return 2;
 }

 public bool RunTheMethod(Action myMethodName)
 {
      myMethodName();
      return true;
 }

Затем вызовите свой метод, используя

RunTheMethod(() => Method1("MyString1"));

Или же

public static object InvokeMethod(Delegate method, params object[] args)
{
     return method.DynamicInvoke(args);
}

Затем просто вызовите метод

Console.WriteLine(InvokeMethod(new Func<string,int>(Method1), "MyString1"));

Console.WriteLine(InvokeMethod(new Func<string, int>(Method2), "MyString2"));


Хотя принятый ответ абсолютно правильный, я хотел бы предоставить дополнительный метод.

Я оказался здесь после того, как стал искать решение аналогичного вопроса. Я создаю фреймворк, подключенный к плагину, и, как часть этого, я хотел, чтобы люди могли добавлять пункты меню в меню приложений в общий список, не подвергая действительный объект Menu поскольку среда может развертываться на других платформах, которые не имеют Menu UI объектов. Добавление общей информации о меню достаточно просто, но разрешение разработчику плагина достаточной свободы для создания обратного вызова при нажатии на меню оказалось болью. Пока меня не стало, что я пытался заново изобрести колесо и позвонить в обычное меню и вызвать ответный звонок из событий!

Поэтому решение, столь же простое, как кажется, когда вы это осознаете, ускользало от меня до сих пор.

Просто создайте отдельные классы для каждого из ваших текущих методов, унаследованных от базы, если нужно, и просто добавьте обработчик событий к каждому.


public static T Runner<T>(Func<T> funcToRun)
{
    //Do stuff before running function as normal
    return funcToRun();
}

Использование:

var ReturnValue = Runner(() => GetUser(99));




delegates