[英]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(...);
}
我試圖在每次存儲過程參數更改時不必在代碼中添加/更改行,而只是使用正確的存儲過程參數更改方法簽名。 在這種情況下, parameter1
和parameter2
將是存儲過程中參數的實際名稱。 有任何想法嗎?
沒有反思:
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.