C# Печать свойств TableEntity, но игнорировать эти свойства с атрибутом [IgnoreProperty] - PullRequest
2 голосов
/ 09 мая 2020

Я пытаюсь распечатать объект, реализующий класс TableEntity, без тех, которые следует игнорировать в отношении устойчивости. Подход, который я обычно использую для печати объектов, заключается в использовании StatePrinter.

public class MyEntity : TableEntity
{
    public string MyProperty { get; set; }

    [IgnoreProperty]
    public string MyIgnoredProperty { get; set; }

    public override string ToString()
    {
        Stateprinter printer = new Stateprinter();
        return printer.PrintObject(this);
    }
}

Хотя это довольно хорошо работает для любых классов, с этим классом MyEntity он также печатает MyIgnoredProperty. Есть ли умный способ игнорировать свойства, которые имеют атрибут [IgnoredProperty] как атрибут, при печати объекта?

1 Ответ

3 голосов
/ 09 мая 2020

Вы можете настроить, какие поля / свойства нужны Stateprinter, указав, какой «комбайн» использовать.

Вот простой комбайн, который возвращает только publi c свойства без атрибута 'IgnoreProperty'.

class PersistencePropertiesHarvester : IFieldHarvester
{
    public bool CanHandleType(Type type)
    {
        return typeof(TableEntity).IsAssignableFrom(type);
    }

    public List<SanitizedFieldInfo> GetFields(Type type)
    {
        var fields = new HarvestHelper().GetFieldsAndProperties(type);
        return fields.Where(IsPerstistenceProperty).ToList();
    }

    private static bool IsPerstistenceProperty(SanitizedFieldInfo field)
    {
        return
            // Only return properties ...
            field.FieldInfo.MemberType == MemberTypes.Property          
            &&
            // ... that has a public get method ...
            (field.FieldInfo as PropertyInfo)?.GetGetMethod(false) != null
            &&
            // ... that does not have the IgnoreProperty attribute
            field.FieldInfo.GetCustomAttribute<IgnoreProperty>() == null
            ;           
    }
}

Затем вы используете его так:

public class MyEntity : TableEntity
{
    public string MyProperty { get; set; }

    [IgnoreProperty]
    public string MyIgnoredProperty { get; set; }

    public override string ToString()
    {
        Stateprinter printer = new Stateprinter();
        printer.Configuration.Add(new PersistencePropertiesHarvester());
        return printer.PrintObject(this);
    }
}

И результат new MyEntity().ToString() теперь

new MyEntity()
{
    MyProperty = null
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...