Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何列出函数c的所有变量#_C# - Fatal编程技术网

C# 如何列出函数c的所有变量#

C# 如何列出函数c的所有变量#,c#,C#,我有一个有很多参数的函数 怎么能这样打印所有参数Kay,Value public string GetCompatibility(int MediaId, int ProductsTypId, string id, string PreviousURL, HttpRequestBase Request, int? Width, int? Height, int? CampaignID) { foreach (param in.GetEnvironmentVariables())

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

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);
}

很抱歉,我没有很好地解释这个问题

一个方法上有这么多参数表明您的方法做了太多事情。你应该考虑把它重构成更小的逻辑块。 无论如何,如果您认为您的方法已经尽可能小,您应该将所有参数放入一个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
-类上的反射(坏主意)或直接在
ParamValues
的构造函数中记录所有参数

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

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

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

您可以使用
字典来安排参数

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);
//...

这么多的争论主要是设计不好的迹象。你的方法真的只做一件事吗?您应该考虑将参数拆分为属于一起的对象,并将代码分成几个子方法。不管怎样,你可以使用<代码> PARAMS < /Cord>关键字:<代码>公共字符串GoeCopy[PARAM[Obj][ARG] 。这完全是不可能的。也许考虑将你的参数集更改为传递给方法的类的属性。我不够专业,但我问它是否是可能的。我看不出这段代码闻起来比原来的好多少。如果他想迭代该方法的参数,他可以复制并粘贴。如果他经常更改参数列表,以致于这是不切实际的,那么他将遇到比如何枚举参数更大的问题。如果他想将这些参数迭代到十几个不同的方法中,那么定义十几个参数类就太简单了。显然,这是解决他的问题的办法。或者是他认为自己存在的问题。@EdPlunkett你是对的,很明显,OP的主要问题是一个糟糕的设计。在这种情况下,你是对的,这个答案不能解决这个问题。我甚至不应该告诉你,
params
存在,他会在任何地方使用它,并发布问题,问为什么它说他的int是字符串或其他东西。@EdPlunkett你是对的,我为此添加了一条评论。在我看来,更糟糕的是,你的合同现在已经不清楚了。@L-Four,这不仅仅是你的意见。
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);
//...