Получить количество параметров, переданных в метод? - PullRequest
3 голосов
/ 20 мая 2011

Можно ли получить число параметров, передаваемых методу во время выполнения, и если да, то как?

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

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

Я пытаюсь не добавлять / изменять строку в коде каждый раз, когда меняются параметры моей хранимой процедуры, вместо этого меняю только сигнатуру метода с правильными параметрами хранимой процедуры.В этом случае parameter1 и parameter2 будут фактическими именами параметров в хранимой процедуре.Есть идеи?

Ответы [ 7 ]

4 голосов
/ 20 мая 2011

без отражения:

public int AddSomethingToDatabase(params object[] parameters)
3 голосов
/ 20 мая 2011

Можете ли вы передать параметры в виде коллекции?Таким образом, он неограничен и прост в использовании.Вот как я делаю это для своих собственных проектов

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
}
.
1 голос
/ 20 мая 2011

Я не думаю, что вы можете получить значения параметров, даже с отражением. Если вы не ссылаетесь на них в теле метода, компилятор просто оптимизирует их. Смотрите эти сообщения, например: Могу ли я получить имена / значения параметров процедурно из выполняемой в данный момент функции?

1 голос
/ 20 мая 2011

Если сторонний компонент является опцией, похоже, что BLToolkit будет делать именно то, что вы ожидаете.

Определение вызова для хранимой процедуры в вашем коде будет выглядеть в приведенном ниже фрагменте и постобработано BLT для передачи всех параметров в sproc (по умолчанию он ожидает одинаковые имена в sproc и сигнатуре метода).

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

В модульных тестах больше подробных примеров кода .

Как заявление об отказе от ответственности, BLT поддерживает его, но я сам не использовал его с Mono.

Редактировать: Исходный код BLT доступен и может помочь с вопросом, но идея его реализации несколько отличается от вашей. Вместо использования отражения при каждом вызове, он делает это только тогда, когда класс используется впервые, реализует объявленный абстрактный метод, и после этого момента производительность не снижается.

1 голос
/ 20 мая 2011
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));
}
1 голос
/ 20 мая 2011
Console.WriteLine(MethodInfo.GetCurrentMethod().GetParameters()[0].Name);

Запишет имя первого параметра в текущий метод.

Что касается получения значения, кажется, что отражение не имеет этого.

0 голосов
/ 20 мая 2011
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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...