C# 打印 TableEntity 属性,但忽略那些属性为 [IgnoreProperty] 的属性

C# Print TableEntity Properties, but ignore those properties with attribute [IgnoreProperty]

我正在尝试打印一个实现 TableEntity class 的对象,而没有那些关于持久性应该被忽略的对象。我通常用来打印对象的方法是使用 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);
    }
}

虽然这对任何类型的 classes 都非常有效,但对于此 MyEntity class,它还会打印 MyIgnoredProperty。有没有一种聪明的方法可以在打印出对象时也忽略具有 [IgnoredProperty] 作为属性的属性?

您可以通过配置 "field harvester" 要使用的内容来配置 fields/properties Stateprinter 关心的内容。

这是一个简单的田间收割机,只有 returns public 个属性,没有“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
}