c# out參數 - 使用C#將參數傳遞為參數




c#類別傳遞 c#傳遞function (9)

雖然接受的答案是絕對正確的,但我想提供一個額外的方法。

在我自己尋找類似問題的解決方案後,我最終在這裡結束了。 我正在構建一個插件驅動的框架,作為它的一部分,我希望人們能夠將菜單項添加到應用程序菜單中而不暴露實際的Menu對象,因為框架可能部署在沒有的其他平台上Menu UI對象。 添加有關菜單的一般信息很容易,但允許插件開發人員足夠自由地為菜單單擊時創建回調,這被證明是一種痛苦。 直到我意識到我試圖重新發明輪子,正常的菜單調用並觸發事件的回調!

所以這個解決方案,就像你意識到的那樣簡單,直到現在,我都躲過了。

只需為每個當前方法創建單獨的類,如果必須,則從基類繼承,並且只為每個方法添加一個事件處理程序。

我有幾個方法都具有相同的簽名(參數和返回值),但名稱不同,並且方法的內部是不同的。 我想將方法的名稱傳遞給另一個將調用傳入方法的方法。

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代碼,因為我需要定義參數。



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

用法:

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

你也可以嘗試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"));

您可以使用.net 3.5中的Func委託作為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);
    }
}

你應該使用一個Func<string, int>委託,它表示一個將string作為參數並返回一個int的函數:

public bool RunTheMethod(Func<string, int> myMethod) {
    // do stuff
    myMethod.Invoke("My String");
    // do stuff
    return true;
}

然後使用它:

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

下面是一個示例,它可以幫助您更好地了解如何將函數作為參數傳遞。

假設你有頁面,並且你想打開一個子彈出窗口。 在父頁面有一個文本框,應該基於子彈出文本框填充。

在這裡你需要創建一個委託。

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;
    }


函數或方法是一個指定的可調用代碼片段,它執行一些操作並可選擇返回一個值。

C語言中使用術語函數。 JavaC#人會說它是一種方法(在這種情況下,函數是在類/對像中定義的)。

一個C ++程序員可能會把它稱為一個函數或者有時是方法(取決於他們是在編寫過程式c ++代碼還是正在做面向對象的C ++方式,另外一個C / C ++程序員可能會把它稱為函數,因為術語'method'是在C / C ++文獻中不常用)。

你只需調用它的名字就可以使用一個函數,

result = mySum(num1, num2);


您可以通過首先引用其對象來調用方法,

result = MyCalc.mySum(num1,num2);




c# .net methods delegates