简体   繁体   English

使用FileHelpers写入文件时,是否可以抑制属性?

[英]Is there a way to suppress a property when writing out a file with FileHelpers?

Is there a way to suppress a property when writing out a file with FileHelpers? 使用FileHelpers写入文件时,是否可以抑制属性?

Say I have an object: 说我有一个对象:

[DelimitedRecord(",")]
public class MyClass
{
    public int Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
    public string Field4 { get; set; }
    public string Field5 { get; set; }
}

I want to write out a csv but I want to omit Field3 (regardless if it's populated or not). 我想写出一个csv,但我想省略Field3(无论是否填充)。

Ex. 例如
Output would be: Field1,Field2,Field4,Field5 输出将是:Field1,Field2,Field4,Field5
Is there an attribute that I can use in FileHelpers to suppress writing out a file? 我可以在FileHelpers中使用某个属性来禁止写出文件吗?

From the documentation here and here you would use the FieldValueDiscarded attribute. 此处此处的文档中,您将使用FieldValueDiscarded属性。 Here is the full blurb: 这是完整的内容:

Use the FieldValueDiscarded attribute for fields that you don't use. 对不使用的字段使用FieldValueDiscarded属性。

If your record class has some fields that are not used, the library will discard the value of fields marked by this attribute 如果您的记录类有一些未使用的字段,则库将丢弃此属性标记的字段的值

As a workaround, you can use an AfterWrite event to remove the last delimiter. 解决方法是,可以使用AfterWrite事件删除最后一个定界符。 Something like this: 像这样:

[DelimitedRecord(",")]
class Product : INotifyWrite
{
    [FieldQuoted(QuoteMode.AlwaysQuoted)]
    public string Name;
    [FieldQuoted(QuoteMode.AlwaysQuoted)]
    public string Description;
    [FieldOptional]
    public string Size;

    public void BeforeWrite(BeforeWriteEventArgs e)
    {
        // prevent output of [FieldOptional] Size field
        Size = null;
    }

    public void AfterWrite(AfterWriteEventArgs e)
    {
        // remove last "delimiter"
        e.RecordLine = e.RecordLine.Remove(e.RecordLine.Length - 1, 1);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var engine = new FileHelperEngine<Product>();
        var products = new Product[] { new Product() { Name = "Product", Description = "Details", Size = "Large"} };
        var productRecords = engine.WriteString(products);
        try
        {
            // Make sure Size field is not part of the output
            Assert.AreEqual(@"""Product"",""Details""" + Environment.NewLine, productRecords);
            Console.WriteLine("All tests pass");
        }
        catch (Exception ex)
        {
            Console.WriteLine("An error occurred");
            Console.WriteLine(ex);
        }

        Console.ReadKey();
    }
}

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

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