Преобразование VB.NET в C #, значения параметров по умолчанию - PullRequest
0 голосов
/ 12 февраля 2012

Я конвертирую большой проект VB.Net в C #.Я использовал бесплатный автоматизированный инструмент для их преобразования.VB доволен передаваемыми пустыми параметрами и использует для них значения по умолчанию, указанные в определении метода.После преобразования в коде C # появляется много вызовов, выглядящих следующим образом:

GetElement(ndFirst, WAIT_AFTER_BATCH,false, , , "WAIT");

И компилятор недоволен ...

Может ли кто-нибудь указать мне правильное направление, если я могуредактируйте файлы C # автоматически (поскольку intellisense знает, как это сделать), чтобы заполнить эти значения по умолчанию при выполнении вызова.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2012

У меня также есть опыт, когда я перешел с VB.Net на C # .Net

Вот что вы будете делать:

  1. Прежде всего импорт InteropServices NameSpace

    using System.Runtime.InteropServices;
    
  2. Затем создайте функцию или процедуру, подобную приведенной ниже: (в моем случае это функция)

    static string ResizeImage(string imgTemp,
                              [Optional, DefaultParameterValue(200)] int xLength)
    {
       // Do something HERE
    }
    
0 голосов
/ 13 февраля 2012
  1. Я исправил ошибки компилятора в сгенерированных файлах cs для общих библиотек
  2. Написал утилиту, которая просматривает определения методов в файле и подготовил каталог методов и ParamterInfos всловарь.

     var methodInfos = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
            //this is not exact for methods with different signatures.
            foreach (var methodInfo in methodInfos)
            {
                if(!methodCatalog.ContainsKey(methodInfo.Name)) 
                    methodCatalog.Add(methodInfo.Name, methodInfo.GetParameters());
                else
                {
    
                    methodCatalog.Add(methodInfo.Name + "__" + Guid.NewGuid() , methodInfo.GetParameters());
                }
            }
    
  3. Написал другой метод, где я токенизирую строку для вызова метода, получаю параметры метода (они все "," разделены)

  4. Для пустых значений параметров я устанавливаю значения из своего словаря методов

        for(int i = 0; i < paramValues.Length; i++)
        {
            if(  string.IsNullOrEmpty( paramValues[i].Trim()) )
            {
                paramValues[i] = currentParameterInfos[i].DefaultValue.ToString();
            }
        } 
    
  5. Это подвержено ошибкам, но это лучше, чем входить в файлы и редактировать их вручную.
0 голосов
/ 12 февраля 2012

Я предполагаю, что версия ваших методов на C # имеет параметры по умолчанию, указанные правильно, например.

public void SomeMethod(int paramA = 0, int paramB = 1, int paramC = 2){
   ...
}

Если вы хотите вызвать метод и принять значение по умолчанию для paramB (как в вашем примере), тогда вам нужно назвать параметры

SomeMethod(paramA: 12, paramC: 20);

При этом будут собраны значения для paramA и paramC при использовании значения по умолчанию для paramB.

Кроме того, поскольку paramA находится в правильном положении, это также будет правильным

SomeMethod(12, paramC: 20);

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

SomeMethod(12,20);

Где paramA = 12, paramB = 20 и paramC будет использовать значение по умолчанию 2.

К сожалению, я не знаю, как это можно исправить автоматически. Аналогично, чтобы ускорить процесс, вы можете использовать ReSharper и создать средство форматирования для принудительного применения именованных аргументов. Затем запустите простое регулярное выражение для вашего проекта и очистите все экземпляры ',,'

Примечание Я никоим образом не связан с JetBrains или ReSharper. Я простой клиент этой компании.

...