Использование string.Join вместо foreach - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь реорганизовать свой код, чтобы он стал меньше и лучше выглядел. Я пытаюсь переопределить метод ToString, который возвращает имя класса и все его поля с их текущими состояниями. Вот мой код:

public override string ToString()
{
    var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name);
    //StringBuilder result = new StringBuilder();
    //result.Append(GetType().Name);
    //result.Append("(");
    //foreach (var e in GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name))
    //{
    //    result.Append(e.Name);
    //    result.Append(": ");
    //    result.Append(e.GetValue(this));
    //    result.Append(";");
    //    result.Append(" ");
    //}

    //result.Remove(result.Length - 2, 2);
    //result.Append(")");
    //return result.ToString();
} 

Я получил совет, что мог бы использовать string.Join в сочетании с некоторым LINQ, и это сделало бы эту работу, но я не могу понять, как это сделать. Спасибо за совет!

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Это было бы что-то вроде: (отредактировано: кэшировать информацию о свойствах вместо пересчета при каждом вызове ToString ())

static IEnumerable<PropertyInfo> propertyInfos;
static MyClass()
{
    propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name);
}

public override string ToString()
{
    return $"{GetType().Name}({string.Join("; ", propertyInfos.Select(x => $"{x.Name}: {x.GetValue(this)}"))})";
}

Однако я не думаю, что использовать такое отражение для ToString ()Рекомендуется реализация, так как она не очень эффективна, и реализации ToString () должны быть быстрыми.

0 голосов
/ 28 апреля 2019

Вы можете использовать ObjectDumper, чтобы выполнить тяжелую работу по приведению в соответствие свойств класса.

Пример использования:

class Demo
{
    public int Key { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return ObjectDumper.Dump(this, DumpStyle.Console);
    }
}

var demo = new Demo() { Key = 1, Name = "Foo" };
Console.WriteLine(demo.ToString());

Вывод:

{Demo}
  Key: 1
  Name: "Foo"

Если вывод не тот, который вы хотите, вы можете украсть ObjectDumper исходный код и изменить его по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...