传入“;“参数集”;在C#中

本文关键字:参数 传入 参数集 | 更新日期: 2023-09-27 18:27:00

我不太确定问这个问题的正确方式,所以我只想去问。

我正在寻找将"参数集"传递到方法中的最干净的方法。例如:

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如何为其控件创建回调。但是他们是如何从方法中的对象中获取值的呢?

有什么想法吗?

传入“;“参数集”;在C#中

我认为有三个选项:

  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。使用匿名对象的语法糖很诱人,但如果你的方法依赖于提供的正确参数,那就太糟糕了。老实说,字典方法也会受到这种影响,但至少在那里,你没有处理反思。

从技术上讲,方法应该是自文档化的,这意味着您应该传入单独命名的params或类实例。这样,您就可以确保方法所需的内容已经存在,并且该方法的最终用户可以一目了然地看到满足它所需的东西。字典和匿名对象都没有提供这两种内容,如果您注意到,Microsoft只有在使用匿名对象作为参数时,内容是完全可选的,例如助手中的htmlAttributes。如果某些密钥不存在,那也没什么大不了的,因为无论如何都是可选的。

以下是捕获,如何使用反射从作为对象传递给方法的Anonymous类型中获取属性。

    public void CreateLog(object parameters)
    {
        foreach(var property in parameters.GetType().GetProperties())
        {
            WriteLog(string.Format("{0} - {1}",property.Name, property.GetValue(parameters)));
        }
    }

用法:

CreateLog(new {SiteID = 1, UserId = 2});