I want to get all fields that have null values but i aint even getting any fields:
[Serializable()]
public class BaseClass
{
[OnDeserialized()]
int
Type.GetFields methods returns all public fields. Fields that the compiler autogenerates for you are private, so you need to specify correct BindingFlags
.
type.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
Value1
and Value2
in your Settings
class are properties rather than fields, so you'll need to use GetProperties()
to access them.
(Using the { get; set; }
syntax tells the compiler that you want a property, but that it should generate the get
and set
for you, along with a hidden private field that contains the data.)
The fields generated by the compiler corresponding to properties of your class have the CompilerGenerated attribute. Also the compiler will generate get
and set
methods for handling these fields, depending on the declaration of your property.
From CompilerGeneratedAttribute MSDN documentation:
Distinguishes a compiler-generated element from a user-generated element. This class cannot be inherited.
The name of these fields have the format <PropertyName>k_BackingField
,the methods set
and get
names have the format set_PropertyName
and get_PropertyName
where PropertyName is the name of property.
For example, your Settings
class is compiled as follows:
[Serializable]
public class Settings : BaseClass
{
public Settings(){}
// Properties
[CompilerGenerated]
private bool <Value1>k__BackingField;
[CompilerGenerated]
private bool <Value2>k__BackingField;
[CompilerGenerated]
public void set_Value1(bool value)
{
this.<Value1>k__BackingField = value;
}
[CompilerGenerated]
public bool get_Value1()
{
return this.<Value1>k__BackingField;
}
[CompilerGenerated]
public void set_Value2(bool value)
{
this.<Value2>k__BackingField = value;
}
[CompilerGenerated]
public bool get_Value2()
{
return this.<Value2>k__BackingField;
}
}
If you wish exclude this backing fields you can use this method:
public IEnumerable<FieldInfo> GetFields(Type type)
{
return type
.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null);
}