反射方法 GetFields() 的行为是否改变了?
Has the behavior of reflection method GetFields() changed?
我有一个应用程序具有以下代码行,该代码行已经存在了很长一段时间并且一直没有问题。
FieldInfo[] fields = GetType().GetFields( BindingFlags.Instance | BindingFlags.Public );
最近我们弹出了一个错误,我追溯到这一行,发现无论出于何种原因,这条特定的行都没有从反射中返回任何东西。我将行更新为如下所示,功能已恢复。
PropertyInfo[] fields = GetType().GetProperties( BindingFlags.Instance | BindingFlags.Public )
安全补丁中是否发生了某些更改,从而改变了此反射的行为方式?我也在这个应用程序中从 4.0 升级到 4.5,并认为问题与此有关。我回滚到 4.0,但仍然有问题,这就是为什么我想知道补丁是否是根本原因。我意识到这是一个非常狭窄的问题,但我做了一些研究但没有提出任何建议。
更新
好的,所以我重新尝试通过回滚而不是右键单击 > 属性 > 更改为 4.0 来换回 4.0,FieldInfo[] 行再次开始工作。与下面的 answers/comments 相反,虽然 class 上有属性,但没有对属性进行重构。它们被定义为如下 Jon Hannas 回答中所述的字段。当我在 .net 4.0 和 运行 中启动即时 window 时,GetFields returns 预期结果和 GetProperties returns 什么都没有。当我在 .net 4.5 中执行相同操作时,GetProperties returns 预期的结果和 GetFields returns 什么都没有。我不知道这是一个错误还是与被定义为部分 class 的 class 有关,但从 4.0 到 4.5,GetFields 的执行方式肯定存在差异或变化。我查看了框架版本之间关于此方法的 C# 文档,但没有发现任何区别。也许下面的信息会有所帮助。
public partial class BaseDataObject
{
public string[] GetFieldNames()
{
// GetFields vs. GetProperties code issue here.
}
}
public partial class ImportInvoice
{
public ImportInvoice()
{
// values of the fields are set here
}
}
public partial class ImportInvoice : BaseDataObject
{
public string AField;
// more fields in a list below.
}
这两个版本之间没有显着变化。
更重要的是,您拥有的两段代码不可互换,也从未互换。
您似乎更有可能实际上将调用它的类型从使用字段更改为使用属性,这是一种常见的重构(特别是因为不推荐使用 public 字段)。所以你从这样的地方开始:
public class SomeType
{
public int Something;
public int SomethingElse;
}
类似
public class SomeType
{
public int Something { get; set; }
public int SomethingElse { get; set; }
}
这会使您问题的第一行从 returning 结果变为 return 什么都没有,并使第二行 return 结果与第一行的结果相当至 return.
具有讽刺意味的是,指导重构的工具推荐使用 public 属性而不是字段的原因之一是您可能出于其他原因不得不这样做,这会破坏事情(就像它对你所做的那样)所以最好首先从属性开始。对已经使用的类型的 public 表面进行这样的更改不是一个好主意。
我有一个应用程序具有以下代码行,该代码行已经存在了很长一段时间并且一直没有问题。
FieldInfo[] fields = GetType().GetFields( BindingFlags.Instance | BindingFlags.Public );
最近我们弹出了一个错误,我追溯到这一行,发现无论出于何种原因,这条特定的行都没有从反射中返回任何东西。我将行更新为如下所示,功能已恢复。
PropertyInfo[] fields = GetType().GetProperties( BindingFlags.Instance | BindingFlags.Public )
安全补丁中是否发生了某些更改,从而改变了此反射的行为方式?我也在这个应用程序中从 4.0 升级到 4.5,并认为问题与此有关。我回滚到 4.0,但仍然有问题,这就是为什么我想知道补丁是否是根本原因。我意识到这是一个非常狭窄的问题,但我做了一些研究但没有提出任何建议。
更新
好的,所以我重新尝试通过回滚而不是右键单击 > 属性 > 更改为 4.0 来换回 4.0,FieldInfo[] 行再次开始工作。与下面的 answers/comments 相反,虽然 class 上有属性,但没有对属性进行重构。它们被定义为如下 Jon Hannas 回答中所述的字段。当我在 .net 4.0 和 运行 中启动即时 window 时,GetFields returns 预期结果和 GetProperties returns 什么都没有。当我在 .net 4.5 中执行相同操作时,GetProperties returns 预期的结果和 GetFields returns 什么都没有。我不知道这是一个错误还是与被定义为部分 class 的 class 有关,但从 4.0 到 4.5,GetFields 的执行方式肯定存在差异或变化。我查看了框架版本之间关于此方法的 C# 文档,但没有发现任何区别。也许下面的信息会有所帮助。
public partial class BaseDataObject
{
public string[] GetFieldNames()
{
// GetFields vs. GetProperties code issue here.
}
}
public partial class ImportInvoice
{
public ImportInvoice()
{
// values of the fields are set here
}
}
public partial class ImportInvoice : BaseDataObject
{
public string AField;
// more fields in a list below.
}
这两个版本之间没有显着变化。
更重要的是,您拥有的两段代码不可互换,也从未互换。
您似乎更有可能实际上将调用它的类型从使用字段更改为使用属性,这是一种常见的重构(特别是因为不推荐使用 public 字段)。所以你从这样的地方开始:
public class SomeType
{
public int Something;
public int SomethingElse;
}
类似
public class SomeType
{
public int Something { get; set; }
public int SomethingElse { get; set; }
}
这会使您问题的第一行从 returning 结果变为 return 什么都没有,并使第二行 return 结果与第一行的结果相当至 return.
具有讽刺意味的是,指导重构的工具推荐使用 public 属性而不是字段的原因之一是您可能出于其他原因不得不这样做,这会破坏事情(就像它对你所做的那样)所以最好首先从属性开始。对已经使用的类型的 public 表面进行这样的更改不是一个好主意。