我知道在C#中使用属性时,编译器会为它们生成CIL中的getter和setter(即get_PropertyName和set_PropertyName)。例如,考虑以下代码:
class Program
{
class Test
{
public string Name { get; set; }
}
static void Main(string[] args)
{
//Here I'm using reflection to inspect methods of Test class
Type type = typeof(Test);
foreach (var item in type.GetMethods())
{
Console.WriteLine(item.Name);
}
}
}
这个程序将使用Test
的方法生成输出,其中包括我所说的getter和setter:get_Name
和set_Name
。
据我理解,如果getter和setter是在“幕后”创建的,那么也应该创建一个支持字段,从中获取/设置值。
因此,从前面的例子中,我可以使用反射来检查Test类的字段,就像这样:
static void Main(string[] args)
{
Type type = typeof(Test);
foreach (var item in type.GetFields())
{
Console.WriteLine(item.Name);
}
}
这个程序的输出为空,我猜测原因是创建的后备字段具有“private”访问权限,因此我们无法看到它。但是由于我不知道如何检查它,所以您能否告诉我一个后备字段是否总是被创建(即使我们只有一个简单的属性,仅具有“get;”和“set;”)?