我不太确定问这个问题的正确方式,所以我就直接问。
我正在寻找将“参数集”传递到方法中的最简洁的方法。例如:
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。使用匿名对象的语法糖很诱人,但如果您的方法依赖于提供的正确参数,那么它可能会很糟糕。老实说,字典方法也受到这种方式的影响,但至少在那里,您没有处理反射。
从技术上讲,方法应该是自记录的,这意味着您应该传递单独的命名参数或类实例。这样,您就可以确保您的方法可以获得您所期望的内容,并且该方法的最终用户可以一目了然地看到满足该要求所需的内容。字典和匿名对象都不会为您提供其中任何一个,如果您注意到的话,微软唯一一次使用匿名对象作为参数,其内容是完全可选的,例如帮助程序中的 htmlAttributes
。如果某些键不存在,那么这没什么大不了的,因为无论如何它都是可选的。
关于c# - C#中传入 "Parameter Sets",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319225/