c# - C#中传入 "Parameter Sets"

标签 c# asp.net asp.net-mvc

我不太确定问这个问题的正确方式,所以我就直接问。

我正在寻找将“参数集”传递到方法中的最简洁的方法。例如:

Dictionary<string, string> Parameters = new Dictionary<string, string>();
Parameters.Add("UserID", "12");
Parameters.Add("SiteID", "43");

CreateLog("Hello World!", Parameters);

public void CreateLog(string Message, Dictionary<string, string> Parameters)
{
    ...
}

但是,我想以一种更干净的方式做到这一点,并且我确信有一些我想不到的方法可以做到这一点。我可以制作一个带有字符串和对象的自定义对象,例如:

public void CreateLog(string Message, params LogParameter[] Parameters)
{
    ...
}

然后我可以为每个参数创建一个新的日志参数并将其传入,但我希望比这更简洁,并避免必须为(我认为)应该更简单的东西创建所有这些新对象.

一种可能的解决方案是执行以下操作:

CreateLog("Hello World!", new { UserID = 12, SiteID = 43 });

public void CreateLog(string Message, object Parameters)
{
    ...
}

这类似于 C# ASP.NET 创建 URL 变量的方式/DevExpress 如何为其控件创建回调的方式。但是他们如何从方法中的对象中获取值呢?

有什么想法吗?

最佳答案

我认为三个选项:

  1. 按照您的建议使用字典。

  2. 创建一个充当 DTO 的类并传递该类:

    public class LogParameters
    {
        public int UserId { get; set; }
        public int SiteId { get; set; }
    }
    
    public void CreateLog(string message, LogParameters parameters)
    
  3. 使用匿名对象,这是您也建议的方法。在您的方法中,您必须依靠反射将对象转换为您实际可以使用的东西。

    Microsoft 通过 HtmlHelper.AnonymousObjectToHtmlAttributes 提供了一种方法来执行此操作,但因此您不需要依赖于 System.Web.Mvc 命名空间(该命名空间的源代码)该方法如下:

    public static IDictionary<string, object> AnonymousObjectToHtmlAttributes(object htmlAttributes)
    {
        Dictionary<string, object> result;
        var valuesAsDictionary = htmlAttributes as IDictionary<string, object>;
        if (valuesAsDictionary != null)
        {
            result = new Dictionary<string, object>(valuesAsDictionary, StringComparer.OrdinalIgnoreCase);
        }
        else
        {
            result = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
    
            if (htmlAttributes != null)
            {
                foreach (var prop in htmlAttributes.GetType().GetRuntimeProperties())
                {
                    var value = prop.GetValue(htmlAttributes);
                    result.Add(prop.Name, value);
                }
            }
        }
    
        return result;
    }
    

    这应该会给您带来根据您自己的代码进行调整所需的灵感。

就我个人而言,在这些场景中我通常采用方法 1 或 2。使用匿名对象的语法糖很诱人,但如果您的方法依赖于提供的正确参数,那么它可能会很糟糕。老实说,字典方法也受到这种方式的影响,但至少在那里,您没有处理反射。

从技术上讲,方法应该是自记录的,这意味着您应该传递单独的命名参数或类实例。这样,您就可以确保您的方法可以获得您所期望的内容,并且该方法的最终用户可以一目了然地看到满足该要求所需的内容。字典和匿名对象都不会为您提供其中任何一个,如果您注意到的话,微软唯一一次使用匿名对象作为参数,其内容是完全可选的,例如帮助程序中的 htmlAttributes 。如果某些键不存在,那么这没什么大不了的,因为无论如何它都是可选的。

关于c# - C#中传入 "Parameter Sets",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319225/

相关文章:

c# - 在远程桌面上通过 SSH 连接 MySql 数据库时出现 1042 错误

c# - 有开源的 asp.net 服务器吗?

c# - ASP.NET Core 1.0 RC2 中的 "The type or namespace name could not be found"

javascript - 在 mvc View 中显示/隐藏文本区域

c# - ASP.NET MVC 3 : StackOverflowException when using PartialView

c# - 如何从 C++ 调用 C#

c# - 从蓝牙接收字符串后使用线程更新标签

c# - 更改选择列表中的值c#

c# - 在 Entity Framework 中使用TPT设计的多级继承

c# - 如何在 C#/.Net 中模拟结束进程树