c# - 获取参数名称方法

标签 c# optional-parameters nameof

我有一个带有大量参数的方法。其中一些是可选的。因此,为了方便地使用此方法,我使用了可选参数功能。

此外,此方法构建了一个 Dictionary<string,string>以参数名称作为字典的键,参数的值作为非空参数的字典值。

方法如下:

public string CreateParameterDictionary(
    string id,
    string firstName,
    string lastName,
    string address,
    string postalCode,
    string lorem = null,
    string ipsum = null,
    string dolor = null,
    //...
    string sit = null,
    string amet = null)
{
    if (String.IsNullOrWhiteSpace(id) ||
        String.IsNullOrWhiteSpace(firstName) ||
        String.IsNullOrWhiteSpace(lastName) ||
        String.IsNullOrWhiteSpace(address) ||
        String.IsNullOrWhiteSpace(postalCode))
    {
        throw new ArgumentNullException($"nameof((id) nameof(firstName) nameof(lastName) nameof(address) nameof(postalCode)");
    }

    Dictionary<string,string> parametersDictionary = new Dictionary<string, string>();
    parametersDictionary.Add(nameof(((id),((id);
    parametersDictionary.Add(nameof(firstName),firstName);
    parametersDictionary.Add(nameof(lastName),lastName);
    parametersDictionary.Add(nameof(address),address);
    parametersDictionary.Add(nameof(postalCode),postalCode);

    if (!String.IsNullOrWhiteSpace(lorem)) parametersDictionary.Add(nameof(lorem), lorem);
    if (!String.IsNullOrWhiteSpace(ipsum)) parametersDictionary.Add(nameof(ipsum), ipsum);
    if (!String.IsNullOrWhiteSpace(dolor)) parametersDictionary.Add(nameof(dolor), dolor);
    //...
    if (!String.IsNullOrWhiteSpace(sit)) parametersDictionary.Add(nameof(sit), sit);
    if (!String.IsNullOrWhiteSpace(amet)) parametersDictionary.Add(nameof(amet), amet);

    return parametersDictionary;
}

可以使用命名参数调用:

CreateParameterDictionary(5, "Dexter, "Morgan", "Miami", 12345, dolor: 5);

如您所见,该方法有点冗长。想知道有没有更简洁的写法(不用反射)

谢谢!

编辑

谢谢您的回答 但是,我的问题并不清楚。只是一个精度:

  • 我的真实方法中的参数名称不是 param1、param2 等,而是更多的业务名称,如 id、firstName、lastName、address1 = null。 这样我们在使用这个方法的时候,就比较容易知道哪个参数是必填的,哪些不是。在此之前,我使用了 params string[],但是当我使用它时,我无法获得参数的名称。

希望我的解释现在更清楚了。

最佳答案

好吧,一个有那么多参数的方法肯定是一种代码味道。 我会考虑创建一个支持类,用作 DTO(数据传输对象)。

一些简单的东西,比如:

public class YourBusinessObjectRequestDto
{
    public string id { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string address { get; set; }
    public string postalCode { get; set; }
    ...

    public Dictionary<string, string> ToDictionary()
    {
        var dict = new Dictionary<string, string>()
        {
          { "id", id },
          { "firstName", firstName },
          { "lastName", lastName },
          { "address", address },
          { "postalCode", postalCode },
          { "...", ... }
        };

        return dict.Where(pair => pair.Value != null).ToDictionary(pair => pair.Key, pair => pair.Value);
    }
}

代码略有重复,但尽可能简单,并且足够符合我的口味。

如果您可以用性能来权衡易维护性,则可以利用绝大多数 Json 库的动态序列化功能。

使用 Json.Net ,你可以这样做:

public Dictionary<string, string> ToDictionary()
{
    var json = JsonConvert.SerializeObject(this);

    var serializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };

    return JsonConvert.DeserializeObject<Dictionary<string, string>>(json, serializerSettings);
}    

它不会尽可能快,但只要您处理的是简单类型,它就会执行得很好并适应您可以放入列表中的每个参数。

这种方法的最大优点是调试和管理非常简单:不需要位置参数。

编辑: 我错过了“排除非空值”的要求。我编辑了代码以支持这一点。

关于c# - 获取参数名称方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37917939/

相关文章:

f# - 抽象类类型签名中的可选参数

javascript - 在 react 路由器中传递可选参数

c# - 类型转换名称

c# - 如何使用 Entity Framework 在具有多个联接的查询中使用可选参数?

c# - 为随机和不重复创建数字

c# - 无法在 WPF 应用程序 C# VS2010 中使用 SendKeys

c# - 可以通过编程方式终止 TCP/IP 堆栈吗?

c# - 在编译时获取类的属性名称,无需对象实例化

c# - 为什么 nameof() 在 Linq 表达式中给出了不明确的调用警告,但当我使用与字符串相同的值时却没有?

C# - 按选定列对矩形数组进行排序