VB.NET到C#的转换,默认参数值

本文关键字:默认 参数 转换 NET VB | 更新日期: 2023-09-27 18:24:14

我正在将一个大型VB.Net项目转换为C#。我使用了一个免费的自动化工具来转换它们。VB对传入的空参数很满意,并使用方法定义中提供的默认值。转换后,C#代码中有许多调用如下所示:

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

编译器不高兴。。。

如果我可以在进行调用时自动编辑C#文件(因为intellisense知道如何编辑)以填充这些默认值,有人能为我指明正确的方向吗。

VB.NET到C#的转换,默认参数值

我假设您的方法的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并创建一个格式化程序来强制使用命名参数。然后在您的项目上运行一个简单的regex,并清除任何",,"实例

注意我与JetBrains或ReSharper没有任何关系。我只是这家公司的客户

当我从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
    }
    
  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. 这很容易出错,但它比手工输入文件并进行编辑要好