获取传递给方法的参数数量?

时间:2011-05-20 13:34:21

标签: c# mono

是否可以在运行时获取传递给方法的参数数量,如果是这样的话?

例如,如果可能的话,我可以使用如下的数据库交互方法,

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

我试图在每次存储过程参数更改时不必在代码中添加/更改行,而只是使用正确的存储过程参数更改方法签名。在这种情况下,parameter1parameter2将是存储过程中参数的实际名称。有什么想法吗?

7 个答案:

答案 0 :(得分:4)

没有反思:

public int AddSomethingToDatabase(params object[] parameters)

答案 1 :(得分:3)

您可以将参数作为集合传递吗?这样它无限且易于使用。 这就是我为自己的项目做的事情

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
}

答案 2 :(得分:1)

Console.WriteLine(MethodInfo.GetCurrentMethod().GetParameters()[0].Name);

将第一个参数的名称写入当前方法。

至于获得价值,似乎反思没有这个。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如果第三方组件是一个选项,看起来BLToolkit会完全符合您的预期。

代码中存储过程的调用定义将类似于下面的代码段并由BLT进行后处理,以将所有参数传递给sproc(默认情况下,它需要在sproc和方法签名中使用相同的名称)。

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

单元测试中有更多detailed code examples

作为免责声明,BLT支持它,但我自己并没有将它与Mono一起使用。

编辑:BLT源代码可用,可能有助于解决问题,但其实现方法与您的实现方式略有不同。它不是在每次调用时使用反射,而是仅在第一次使用类时实现,实现声明的抽象方法,并且在此之后没有性能降级。

答案 5 :(得分:1)

我认为即使使用反射也无法获取参数值。如果您没有在方法体中专门引用它们,编译器将只是优化它们。 请参阅这些帖子,例如: Can I get parameter names/values procedurally from the currently executing function?

答案 6 :(得分:0)

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