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
}
我正在尝试打印一个实现 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
}