3

所以,我应该设计一种方法来记录我的应用程序所做的一切,并且我正在考虑在我的方法中做这样的事情:

宣言:

public static void Write(string text, params object[] parameters) {}

用法:

if (Log.On) Log.Write("Hello", valueA, valueB, valueC);

所以在我看来这是优雅和干净的。但是它有一个很大的缺陷,即没有以任何方式标记这些值。对我来说,显而易见的解决方案是这样的方法:

public static void Write(string text, Dictionary<string, object> parameters) {}

但是这种方法会使我的代码混乱。

if (Log.On)
{
Dictionary<string, object> p = new Dictionary<string, object>();
p.Add("valueA", valueA);
p.Add("valueB", valueB);
p.Add("valueC", valueC);
Log.Write("Hello", p);
}

任何想法如何使这种方法尽可能不引人注目?

4

1 回答 1

2

你可以使用这个:

public static void LogValues(string text, object values)
{
    var properties = values.GetType().GetProperties();
    Log.WriteLine(text + ": " + string.Join(", ",
        properties.Select(property =>
        {
            var name = property.Name;
            var value = property.GetValue(values);
            return name + " = " + (value != null ? value.ToString() : "null");
        })));
}

像这样:

int x = 5;
double y = 7.2;
LogValues("Some message", new { y, s = "test", x });

这将在您的日志中生成这样的一行:

Some message: y = 7.2, s = test, x = 5

这里的关键是对values参数使用匿名类型。这使您可以传入“命名”变量,而不仅仅是这些变量的值。

<name> = <value>如果您希望打印出的对具有一致的顺序,您可以在 LINQ 查询中的.OrderBy(property => property.Name)之前插入一个。.Select(...)

于 2013-10-03T05:46:26.520 回答