Est-il possible, en regardant les propriétés d'une classe, de détecter si l'une d'entre elles est un type de référence.
Prenez ci-dessous un exemple:
public class Client
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ProgrammeClient
{
public int Id { get; set; }
public bool IsActive { get; set; }
public IClient Client { get; set; }
}
ProgrammeClient: -
Id et IsActive sont des propriétés mais Client est un type de référence. Existe-t-il un moyen de détecter cela?
Merci beaucoup, Kohan.
La raison pour laquelle je pose la question est: j'utilise un mappeur qui vérifie que les types sont les mêmes avant de faire correspondre les noms de propriété et de copier les valeurs. Mon espoir est de détecter les classes et de remplacer la correspondance de type et de copier simplement les propriétés des classes si le type THEY correspond.
Eh bien, il semble que vous pouvez essayer de détecter la différence entre un type de valeur et un type de référence. Vous pouvez le découvrir en utilisant Type.IsValueType
... mais sachez que les types de valeur peuvent aussi facilement avoir des propriétés. (Pensez à DateTime
par exemple.) De plus, certains types que vous voudrez peut-être considérer comme "non des objets" sont des types de référence - string
en étant un excellent exemple.
Une autre option serait d'utiliser Type.IsPrimitive
- est-ce ce que vous recherchez? Si tel est le cas, vous devez savoir que decimal
, DateTime
et string
ne sont pas pas des types primitifs .
Si vous pouvez décrire exactement ce qui fait d'un type un "objet" dans votre façon de penser (ou plutôt, de quelque manière que ce soit qui fait une différence sémantique dans ce que vous essayez de faire avec votre type). Je soupçonne que vous ne disposez pas actuellement d'un ensemble de critères très clairs - l'élaboration de ces critères pourrait également clarifier d'autres aspects de votre tâche actuelle.
Vous pouvez utiliser une petite réflexion pour voir si une propriété est un type de valeur ou un type de classe. La classe est probablement ce que vous entendez par "objet". Tous les types dans .NET dérivent du type d'objet.
Client.GetType().IsClass
Ou vous pouvez parcourir toutes les propriétés et voir celles qui sont composées
foreach(var p in ProgrammeClient.GetType().GetProperties())
{
if(p.PropertyType.IsClass) Console.WriteLine("Found a class");
}
Toutes les propriétés de votre exemple renvoient des objets, car tout est un objet dans .NET; int
et bool
sont des objets. Si vous entendez un type de référence, par opposition aux types de valeur, vous pouvez effectuer les opérations suivantes:
foreach (PropertyInfo pi in typeof(Client).GetProperties()) {
if (pi.PropertyType.IsClass) {
// reference type
// DoMyFunkyStuff
}
}
Vous pouvez énumérer les propriétés via Reflection et les vérifier:
bool ContainsOnlyValues() {
return typeof(ProgrammeClient).GetProperties().All(x => x.PropertyType.IsValueType);
}
La propriété Type.IsvalueType peut révéler cela.
Id.GetType().IsValueType
Ce sera vrai pour Id, faux pour une classe
Si vous utilisez TypeSupport nuget package, vous pouvez simplement faire:
typeof(ProgrammeClient).GetExtendedType().IsReferenceType;
TypeSupport effectue une inspection et fournit des informations plus approfondies sur les capacités d'un type donné, en gérant des choses comme les chaînes, les énumérations, etc. et facilite le codage de ces types de choses.