CsvHelper.Configuration.ClassMap<T> 的动态分配属性
Dynamic assigned Properties for CsvHelper.Configuration.ClassMap<T>
我想通过动态分配的属性使用CsvHelper.Configuration.ClassMap
。
通常您以静态方式映射 属性:您必须分配每个 属性 及其 'text to display'。
using CsvHelper.Configuration;
public sealed class CleanSQLRowDescriptorMap : ClassMap<CleanSQLRowDescriptor>
{
public CleanSQLRowDescriptorMap()
{
Map(f => f.OriginalIndex).Name("Original Index");
Map(f => f.OriginalRow).Name("Original Row");
}
}
我想执行以下操作:
using CsvHelper.Configuration;
public sealed class CleanSQLRowDescriptorMap : ClassMap<CleanSQLRowDescriptor>
{
public CleanSQLRowDescriptorMap()
{
// Filter by attribute (implementation returns PropertyInfo List)
List<PropertyInfo> mappedProperties = CleanSQLRowDescriptor.Create().FilterPropertiesByAttribute();
// Dynamically assign each property and its assigned 'attribute value'
// At the moment I mapped the PropertyInfo.Name, but I actually need to use the Property as the static example above.
// Also need to figure out how to get the Attribute value (DisplayName in this example).
mappedProperties.ForEach(prop => Map(f => prop.Name).Name(prop.Name));
}
}
我目前使用上面的方法如下:
[DisplayName("Original Index")]
public int OriginalIndex { get; set; }
[DisplayName("Original Row")]
public string OriginalRow { get; set; }
public string DonotWantToAssignThis { get; set; }
public List<PropertyInfo> FilterPropertiesByAttribute()
{
// This function already returns only the attributes that use
// [DisplayName] and other attributes defined for other properties,
// ignoring other properties that do not have any of these attributes.
return properties;
}
如何使用 属性Info 列表项动态分配 ClassMap?我想用这些属性创建一个基础 class 作为过滤器,所有实现这个基础 class 的 classes 都将具有相同的功能,从而更容易 'maintain the mappings'。
我设法弄明白了,VS Code 没有给我 Map()
函数的所有重载,所以我错过了重载。
所有示例中都使用了这个:
MemberMap<TClass, TMember> Map<TMember>(Expression<Func<TClass, TMember>> expression, bool useExistingMap = true);
我在里面找到这个 JoshClose/CSVHelper:
public MemberMap Map(Type classType, MemberInfo member, bool useExistingMap = true)
因此,我现在可以直接分配 MemberInfo
,而不是使用不采用类型的 'Expression that requires the property name as TMember'。
下面的代码仅通过使用其 .DisplayName 属性 值显示 单个属性 [DisplayName] 的解决方案.
对于我目前拥有的其他属性,我需要以不同方式处理 属性 值:
mappedProperties.ForEach(prop =>
{
Map(typeof(CleanSQLRowDescriptor), prop).Name(prop.GetCustomAttribute<DisplayNameAttribute>().DisplayName);
});
我想通过动态分配的属性使用CsvHelper.Configuration.ClassMap
。
通常您以静态方式映射 属性:您必须分配每个 属性 及其 'text to display'。
using CsvHelper.Configuration;
public sealed class CleanSQLRowDescriptorMap : ClassMap<CleanSQLRowDescriptor>
{
public CleanSQLRowDescriptorMap()
{
Map(f => f.OriginalIndex).Name("Original Index");
Map(f => f.OriginalRow).Name("Original Row");
}
}
我想执行以下操作:
using CsvHelper.Configuration;
public sealed class CleanSQLRowDescriptorMap : ClassMap<CleanSQLRowDescriptor>
{
public CleanSQLRowDescriptorMap()
{
// Filter by attribute (implementation returns PropertyInfo List)
List<PropertyInfo> mappedProperties = CleanSQLRowDescriptor.Create().FilterPropertiesByAttribute();
// Dynamically assign each property and its assigned 'attribute value'
// At the moment I mapped the PropertyInfo.Name, but I actually need to use the Property as the static example above.
// Also need to figure out how to get the Attribute value (DisplayName in this example).
mappedProperties.ForEach(prop => Map(f => prop.Name).Name(prop.Name));
}
}
我目前使用上面的方法如下:
[DisplayName("Original Index")]
public int OriginalIndex { get; set; }
[DisplayName("Original Row")]
public string OriginalRow { get; set; }
public string DonotWantToAssignThis { get; set; }
public List<PropertyInfo> FilterPropertiesByAttribute()
{
// This function already returns only the attributes that use
// [DisplayName] and other attributes defined for other properties,
// ignoring other properties that do not have any of these attributes.
return properties;
}
如何使用 属性Info 列表项动态分配 ClassMap?我想用这些属性创建一个基础 class 作为过滤器,所有实现这个基础 class 的 classes 都将具有相同的功能,从而更容易 'maintain the mappings'。
我设法弄明白了,VS Code 没有给我 Map()
函数的所有重载,所以我错过了重载。
所有示例中都使用了这个:
MemberMap<TClass, TMember> Map<TMember>(Expression<Func<TClass, TMember>> expression, bool useExistingMap = true);
我在里面找到这个 JoshClose/CSVHelper:
public MemberMap Map(Type classType, MemberInfo member, bool useExistingMap = true)
因此,我现在可以直接分配 MemberInfo
,而不是使用不采用类型的 'Expression that requires the property name as TMember'。
下面的代码仅通过使用其 .DisplayName 属性 值显示 单个属性 [DisplayName] 的解决方案.
对于我目前拥有的其他属性,我需要以不同方式处理 属性 值:
mappedProperties.ForEach(prop =>
{
Map(typeof(CleanSQLRowDescriptor), prop).Name(prop.GetCustomAttribute<DisplayNameAttribute>().DisplayName);
});