传入“;“参数集”;在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如何为其控件创建回调。但是他们是如何从方法中的对象中获取值的呢?
有什么想法吗?
我认为有三个选项:
-
按照你的建议使用字典。
-
创建一个充当DTO的类,并传递:
public class LogParameters { public int UserId { get; set; } public int SiteId { get; set; } } public void CreateLog(string message, LogParameters parameters)
-
使用匿名对象,这也是你建议的方法。在你的方法中,你必须依靠反射来将对象转化为你可以实际利用的东西。
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});