簡體   English   中英

獲取傳遞給方法的參數數量?

[英]Get number of parameters passed to a method?

是否有可能在運行時獲取傳遞給方法的參數數量,如果是這樣的話?

例如,如果可能的話,我可以使用如下的數據庫交互方法,

public void AddSomethingToDatabase(string parameter1, string parameter2)
{
   ...
   foreach(param in parameters)
   {
      sp.AddParameter(GetName(param),param));
   }
   conn.Execute(...);
}

我試圖在每次存儲過程參數更改時不必在代碼中添加/更改行,而只是使用正確的存儲過程參數更改方法簽名。 在這種情況下, parameter1parameter2將是存儲過程中參數的實際名稱。 有任何想法嗎?

沒有反思:

public int AddSomethingToDatabase(params object[] parameters)

你能把參數作為集合傳遞嗎? 這樣它無限且易於使用。 這就是我為自己的項目做的事情

public void AddSomethingToDatabase(Dictionary<string, object> parameters)
{
   foreach(KeyValuePair<string, object> param in parameters)
   {
      string paramname = param.Key;
      object paramvalue= param.Value;
      sp.AddParameter(paramname, paramvalue);
   }
   conn.Execute(...);
}

編輯:我想澄清一下我在自己的程序中如何使用這種方法。

我在方法本身中指定了數據庫過程參數,並像你一樣傳遞參數。 我確實知道有更好的方法,比如使用DTO

public void AddSomethingToDatabase(string param1, int param2)
{
   Dictionary<string, object> parameters = new Dictionary<string, object>();
   parameters.Add("pID", param1);
   parameters.Add("pName", param2);

   ModifyDatabase(parameters, "update_myTable");
}

public void ModifyDatabase(Dictionary<string, object> parameters, string procedure)
{
   // Do necessary checks on parameters here
   // Check database availability
   // And many other checks that would be recurring for every database transaction
   // ... that's why I have them all in one place. Executing Queries is the same
   // ... every time. Why would you write the error handling twice? :-)

   // Loop parameters and fill procedure parameters

   // Execute the lot
}
Console.WriteLine(MethodInfo.GetCurrentMethod().GetParameters()[0].Name);

將第一個參數的名稱寫入當前方法。

至於獲得價值,似乎反思沒有這個。

public class NameValue
{
    public NameValue(string name, object value)
    {
        Name = name;
        Value = value;
    }
    public string Name { get; set; }
    public object Value { get; set; }
}

private void DoSomething(params NameValue[] args)
{
    foreach (var nameValue in args)
    {
        //sp.AddParameter(nameValue.Name, nameValue.Value);
    }
}

private void GenerateTable(Table table)
{
    DoSomething(new NameValue("name", "Jonas"), new NameValue("Age", 99));
}

如果第三方組件是一個選項,看起來像BLToolkit將完全符合您的期望。

代碼中存儲過程的調用定義將類似於下面的代碼段並由BLT進行后處理,以將所有參數傳遞給sproc(默認情況下,它在sproc和方法簽名中需要相同的名稱)。

[SprocName("sp_MySproc")]
public abstract void CallMySproc(string @parameter1, string @parameter2); 

單元測試中有更詳細的代碼示例

作為免責聲明,BLT支持它,但我自己並沒有將它與Mono一起使用。

編輯: BLT源代碼可用,可能有助於解決問題,但其實現思路與您的有些不同。 它不是在每次調用時使用反射,而是僅在第一次使用類時實現它,實現聲明的抽象方法,並且在此之后沒有性能降級。

我認為即使使用反射也無法獲得參數值。 如果您沒有在方法體中專門引用它們,編譯器將只是優化它們。 例如,請參閱這些帖子: 我是否可以從當前正在執行的函數中獲取參數名稱/值?

public class SPParamCollection : List<SPParams>{ }
public struct SPParams
{
    public string Name { get; set; }
    public object   Value { get; set; }
    public SqlDbType SqlDbType { get; set; }
}
public void AddSomethingToDatabase(SPParamCollection arrParam)
{
    foreach (SPParams param in arrParam)
        cmd.Parameters.Add(param.Name, param.Value);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM