首页 > 解决方案 > 对象未填充来自 C# 扩展方法的值,但在扩展方法中具有值

问题描述

我实现了一个扩展方法来从 Excel 文件(.NET Framework 4.8 中的所有内容)中获取字段,但是该fields对象没有填充方法Field中的值Main(),而它确实在扩展方法中具有值。有没有人看到任何问题?我在out某处错过了钥匙吗?

恐怕有两个指向不同字段对象的引用/指针..

另外,我真的必须fields在“应用”扩展方法之前实例化吗?

static void Main(string[] args)
{
    Fields fields = new Fields(); // Fields is a class which implements IEnumerable<Field>

    fields.ReadFromExcel(); // fields is still null here, despite having values within the extension method
}

扩展方法(简化)

public static class ExtensionMethods
{
    public static void ReadFromExcel(this Fields fields)
    {
        ExcelConnector excel = new ExcelConnector();
        
        fields = excel.ReadFields(); // fields is correctly populated with fields from Excel here
    }
}

感谢您的任何见解:-)

更新

如果我更改fields = Processor.ReadFromExcel();

public static class Processor
{
    public static Fields ReadFromExcel()
    {
        // ...
        return excel.ReadFields;
    }
}

它运作良好,但随后失去了扩展方法功能......

标签: c#objectoutputextension-methods

解决方案


当你这样做时:

Fields fields = new Fields(); // Fields is a class with implements IEnumerable<Field>

fields.ReadFromExcel();

您正在传递必须的fields参考ReadFromExcel。那么当你这样做时:

public static void ReadFromExcel(this Fields fields)
{
    fields = null;
}

您只是在修改参数fields指向的内容。您不会更改原始变量的引用。

虽然你可以这样做:

public static Fields ReadFromExcel(this Fields fields)
{
    return new ExcelConnector().ReadFields();
}

// and 

Fields fields = new Fields();
fields = fields.ReadFromExcel();

这在很大程度上浪费了最初的fields分配。对于扩展方法,这也不是一个好的用法,因为您不是在扩展 Fields,而只是创建一个全新的实例。这应该只是:

public static Fields ReadFromExcel()
{
    ExcelConnector excel = new ExcelConnector();
    
    return excel.ReadFields();
}

// and

Fields fields = ExtensionMethods.ReadFromExcel();

此外,很可能你不应该有一个Fields类,你可以并且应该使用List<Field>(或者IEnumerable<Field>如果你不需要更改集合)。


推荐阅读