CsvHelper.Configuration.ClassMap<T> 的动态分配属性

如何解决CsvHelper.Configuration.ClassMap<T> 的动态分配属性

我想通过动态分配的属性使用 CsvHelper.Configuration.ClassMap

通常您以静态方式映射这样的属性您必须分配每个属性及其“要显示的文本”。

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;
            }

如何使用项目的 PropertyInfo 列表来动态分配 ClassMap?我想用这些属性创建一个基类作为过滤器,所有实现这个基类的类都具有相同的功能,从而更容易“维护映射”。

解决方法

我设法弄明白了,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,而不是使用不采用类型的“需要属性名称为 TMember 的表达式”。

下面的代码仅显示了使用单个属性 [DisplayName] 的 .DisplayName 属性值的解决方案。
对于我目前拥有的其他属性,我需要以不同的方式处理属性值:

mappedProperties.ForEach(prop =>
{
   Map(typeof(CleanSQLRowDescriptor),prop).Name(prop.GetCustomAttribute<DisplayNameAttribute>().DisplayName);
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?