繁体   English   中英

如何从C#中的自定义class中提取属性名称

[英]How to extract property names from custom class in C#

我正在制作 function 用于将表导出到 .csv 文件。

我有列表,其中 T 是自定义 class。

对于 .csv 文件中的列,我需要 T 的属性名称。

我怎样才能将它们提取到其他列表?

您可以使用反射:

var propertyNames = typeof(T).GetProperties()
      .Select(p => p.Name));

你的问题有点难以理解。 但是我为您写了一些示例代码,希望它能回答您的问题。 我相信您只需要帮助解决问题的反思部分。

using System.Reflection;

namespace Example
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            var types = Assembly.GetExecutingAssembly().GetTypes();
            foreach (var type in types)
            {
                var props = GetProperties(type);

                foreach (var property in props)
                {
                    Console.WriteLine($"Type: {type.FullName} -> Property: {property.Name}");
                }
            }
        }

        public static PropertyInfo[] GetProperties(Type T)
        {
            return T.GetProperties();
        }
    }

    public class TestClass
    {
        public int Health { get; set; } // Example property
    }
}

我维护了一些使这非常容易的库: Sylvan.Data.Csv 和 Sylvan.Data

Sylvan.Data 库提供了一个 API 用于将IEnumerable<T>转换为DbDataReader ( AsDataReader )。 Sylvan.Data.Csv 库提供了一个 API 用于将DbDataReader写入 CSV 文件 ( CsvDataWriter )。 您可以将这些组合起来制作一个扩展方法:

using Sylvan.Data;
using Sylvan.Data.Csv;

static class CsvMethods
{
    public static long WriteAsCsv<T>(this IEnumerable<T> seq, string file)
        where T : class
    {
        using var writer = File.CreateText(file);
        return WriteAsCsv(seq, writer);
    }

    public static long WriteAsCsv<T>(this IEnumerable<T> seq, TextWriter output) 
        where T : class
    {
        using var csvWriter = CsvDataWriter.Create(output);
        return csvWriter.Write(seq.AsDataReader());
    }
}

然后,您可以使用一行代码将List<T>写入 CSV 文件:

List<MyData> data = ...;
data.WriteAsCsv("mydata.csv");

实现这些库的代码非常高效,可以处理 CSV 种边缘情况,例如包含分隔符、引号等的字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM