obtenir les champs de la réflexion
Je veux obtenir tous les champs ont des valeurs null, mais je n'est pas même l'obtention de tous les champs:
[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;
}
}
Et puis j'ai une classe :
[Serializable()]
public class Settings : BaseClass
{
public bool Value1 { get; set; }
public bool Value2 { get; set; }
}
Mais quand j'arrive à
var properties = type.GetType().GetFields();
puis-je obtenir 0 champs, il doit trouver les 2 champs.
Est le type.getType().GetFields() de mal à utiliser ? ou suis-je envoyer dans la mauvaise classe de la classe de base?
Vous devez vous connecter pour publier un commentaire.
Type.GetFields méthodes retourne tous les domaines publics. Champs que le compilateur autogenerates pour vous sont privés, donc vous devez spécifier corriger
BindingFlags
.Les champs générés par le compilateur correspondant aux propriétés de votre classe ont les CompilerGenerated attribut. Ensuite, le compilateur va générer
get
etset
méthodes de traitement de ces champs, selon la déclaration de votre propriété.De CompilerGeneratedAttribute documentation MSDN:
Le nom de ces champs ont le format
<PropertyName>k_BackingField
,les méthodesset
etget
les noms ont le formatset_PropertyName
etget_PropertyName
où PropertyName est le nom de la propriété.Par exemple, votre
Settings
classe est réalisé de la façon suivante:Si vous souhaitez exclure de ce champs de sauvegarde, vous pouvez utiliser cette méthode:
Value1
etValue2
dans votreSettings
classe sont des propriétés plutôt que de champs, de sorte que vous aurez besoin d'utiliserGetProperties()
pour y accéder.(À l'aide de la
{ get; set; }
syntaxe indique au compilateur que vous voulez une propriété, mais qu'il doit générer laget
etset
pour vous, avec un caché privé champ qui contient les données.)