【问题标题】:how to list all variables of function c# [duplicate]如何列出函数c#的所有变量[重复]
【发布时间】:2017-02-19 00:39:03
【问题描述】:

我有一个有很多参数的函数 怎么能这样打印所有参数凯,值

public string GetCompatibility(int MediaId, int ProductsTypId, string id, string PreviousURL, HttpRequestBase Request, int? Width, int? Height, int? CampaignID)
{
      foreach (param in.GetEnvironmentVariables())
                 Console.WriteLine("  {0} = {1}", param.Key, param.Value);
}

对不起,我没有很好地解释这个问题

【问题讨论】:

  • 这么多参数主要是糟糕设计的标志。你的方法真的能做到one 吗?您应该考虑将参数拆分为属于一起的对象,并将您的代码分成几个子方法。无论如何,您可以使用params-keyword 使用一组参数:public string GetCompatibility(params object[] args)
  • 这完全不可能。
  • 也许考虑将您的参数集更改为传递给方法的类的属性?
  • 我不够专业,但我问是否可以

标签: c#


【解决方案1】:

一个方法有这么多参数表明你的方法做了太多的事情。您应该考虑将其重构为更小的逻辑块。

无论如何,如果您认为您的方法已经 尽可能小,则应该将所有参数放入单个 DTO:

public class ParamValues
{
    public int MediaId {get; set; }
    // ...

    public ParamValues(int MediaId, int ProductsTypId, string id, string PreviousURL, HttpRequestBase Request, int? Width, int? Height, int? CampaignID)
    {
        this.MediaId = MediaId;
        // ...
    }
}

现在在您的调用代码中:

GetCompatibility(new ParamValues(...));

现在您可以轻松地记录所有参数,或者使用 ParamValues-class 上的反射(坏主意)或直接在 ParamValues 的构造函数中。

另一种方法是使用params-关键字:

public string GetCompatibility(params object[] args)
{
    foreach(var arg in args) Console.WriteLine(arg);
}

但是,如果您使用这种方法,您将使用参数名称。此外,你只是隐藏了方法的复杂性,这是一个糟糕的设计,所以你应该选择这个机会作为最后的手段。

【讨论】:

  • 我看不出这段代码的味道比原始代码好多少。如果他想遍历 that 方法的参数,他可以复制和粘贴。如果他经常更改参数列表以至于不切实际,那么他遇到的问题比如何枚举参数要大得多。如果他想将参数迭代到十几个不同的方法,那么定义十几个参数类就很简单了。不过,显然,这解决他的问题的方法。或者他认为他有问题,无论如何。
  • @EdPlunkett 你说得对,显然 OP 的主要问题一个糟糕的设计。在这种情况下,你是对的,这个答案不能解决这个问题。
  • 恕我直言 OP 甚至不应该被告知 params 存在,他会到处使用它并发布关于为什么它说他的 int 是字符串或其他东西的问题。
  • @EdPlunkett 你说得对,我为此添加了评论。
【解决方案2】:

您可以使用Dictionary 来安排您的参数。

public static void GetCompatibility(Dictionary<string, object> paramters)
{
    foreach (var pair in paramters)
        Console.WriteLine("  {0} = {1}", pair.Key, pair.Value);
}

//...
Dictionary<string, object> paramters = new Dictionary<string, object>
{
    {"MediaId", 1},
    {"ProductsTypId", 1},
    {"PreviousURL", "http://xxx"},
    {"Request", null},
    {"Width", 123},
    {"Height", 123},
    {"CampaignID", 123},
};
GetCompatibility(paramters);
//...

或者,如果参数是固定的,使用结构来做到这一点。

public struct CompatibilityParam
{
    public int MediaId;
    public int ProductsTypId;
    public string id;
    public string PreviousURL;
    public HttpRequestBase Request;
    public int? Width;
    public int? Height;
    public int? CampaignID;
}
public static void GetCompatibility(CompatibilityParam paramters)
{
    Console.WriteLine("  MediaId = {0}", paramters.MediaId);
    Console.WriteLine("  ProductsTypId= {0}", paramters.ProductsTypId);
    Console.WriteLine("  PreviousURL= {0}", paramters.PreviousURL);
    Console.WriteLine("  Request= {0}", paramters.Request);
    Console.WriteLine("  Width= {0}", paramters.Width);
    Console.WriteLine("  Height= {0}", paramters.Height);
    Console.WriteLine("  CampaignID= {0}", paramters.CampaignID);
}

//...
CompatibilityParam paramters = new CompatibilityParam
{
    MediaId = 1,
    ProductsTypId = 1,
    PreviousURL = "http://xxx",
    Request = null,
    Width = 123,
    Height = 123,
};
GetCompatibility(paramters);
//...

【讨论】:

  • 在我看来,这会更糟,因为您的合同现在还不清楚。
  • @L-Four 这不仅仅是你的意见。
猜你喜欢
  • 2020-06-23
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2013-02-08
  • 2015-12-15
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多