I want to get all fields that have null values but i aint even getting any fields:
[Serializable()]
public class BaseClass
{
[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
FixNullString(this);
}
public void FixNullString(object type)
{
try
{
var properties = type.GetType().GetFields();
foreach (var property in from property in properties
let oldValue = property.GetValue(type)
where oldValue == null
select property)
{
property.SetValue(type, GetDefaultValue(property));
}
}
catch (Exception)
{
}
}
public object GetDefaultValue(System.Reflection.FieldInfo value)
{
try
{
if (value.FieldType == typeof(string))
return "";
if (value.FieldType == typeof(bool))
return false;
if (value.FieldType == typeof(int))
return 0;
if (value.FieldType == typeof(decimal))
return 0;
if (value.FieldType == typeof(DateTime))
return new DateTime();
}
catch (Exception)
{
}
return null;
}
}
And then i have a class :
[Serializable()]
public class Settings : BaseClass
{
public bool Value1 { get; set; }
public bool Value2 { get; set; }
}
But when i comes to
var properties = type.GetType().GetFields();
then i get 0 fields, it should find 2 fields.
Is type.getType().GetFields() wrong to use ? or am i sending in the wrong class to the base class?
Type.GetFields methods returns all public fields. Fields that the compiler autogenerates for you are private, so you need to specify correct
BindingFlags
.The fields generated by the compiler corresponding to properties of your class have the CompilerGenerated attribute. Also the compiler will generate
get
andset
methods for handling these fields, depending on the declaration of your property.From CompilerGeneratedAttribute MSDN documentation:
The name of these fields have the format
<PropertyName>k_BackingField
,the methodsset
andget
names have the formatset_PropertyName
andget_PropertyName
where PropertyName is the name of property.For example, your
Settings
class is compiled as follows:If you wish exclude this backing fields you can use this method:
Value1
andValue2
in yourSettings
class are properties rather than fields, so you'll need to useGetProperties()
to access them.(Using the
{ get; set; }
syntax tells the compiler that you want a property, but that it should generate theget
andset
for you, along with a hidden private field that contains the data.)