对象未填充来自 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>
更改集合)。
我实现了一个扩展方法来从 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>
更改集合)。