对象未填充来自 C# 扩展方法的值,但在扩展方法中具有值

Object not populated with values from an C# extension method, but has value within the extension method

我实现了一个扩展方法来从 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;
    }
}

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

当你这样做时:

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 分配。这也不是扩展方法的好用法,因为您不是 extending Fields 而是只是创建一个全新的实例。这应该只是:

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

// and

Fields fields = ExtensionMethods.ReadFromExcel();

此外,您很可能不应该使用 Fields class,您可以而且应该使用 List<Field>(如果不需要,则可以使用 IEnumerable<Field>更改集合)。