J'essaie d'implémenter la transformation de données à l'aide de l' exemple Reflection 1 dans mon code.
La GetSourceValue
fonction a un commutateur comparant différents types, mais je veux supprimer ces types et propriétés et GetSourceValue
obtenir la valeur de la propriété en utilisant une seule chaîne comme paramètre. Je veux passer une classe et une propriété dans la chaîne et résoudre la valeur de la propriété.
Est-ce possible?
c#
reflection
properties
pedrofernandes
la source
la source
public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
src.GetType().GetProperty(propName)?.GetValue(src, null);
";).GetProperty
and throwPropertyNotFoundException
ou quelque chose si null.)Que diriez-vous quelque chose comme ça:
Cela vous permettra de descendre dans les propriétés en utilisant une seule chaîne, comme ceci:
Vous pouvez utiliser ces méthodes comme des méthodes statiques ou des extensions.
la source
PropertyInfo.PropertyType
au lieu deobj.GetType()
sur des propriétés imbriquées, tout comme l'accès à la propriété sur une propriété imbriquée.nameof
expression à partir de C # 6 comme ceci:nameof(TimeOfDay.Minutes)
sur le paramètre name lors de l'appel de la fonction pour débarrasser les chaînes magiques et ajouter une sécurité de temps de compilation à ces appels.Ajoutez à tout
Class
:Ensuite, vous pouvez utiliser comme:
la source
SetValue
etGetValue
fonctionneObject
. Si vous avez besoin de travailler avec un type spécifique, vous devez lancer le résultat deGetValue
et convertir la valeur pour l'attribuer avecSetValue
Qu'en est-il de l'utilisation
CallByName
de l'Microsoft.VisualBasic
espace de noms (Microsoft.VisualBasic.dll
)? Il utilise la réflexion pour obtenir les propriétés, les champs et les méthodes des objets normaux, des objets COM et même des objets dynamiques.et alors
la source
Grande réponse par jheddings. Je voudrais l'améliorer en permettant le référencement de tableaux agrégés ou de collections d'objets, afin que propertyName puisse être property1.property2 [X] .property3:
la source
Si j'utilise le code d' Ed S. j'obtiens
Il semble que ce
GetProperty()
ne soit pas disponible dans Xamarin.Forms.TargetFrameworkProfile
estProfile7
dans ma bibliothèque de classes portable (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin.Android, Xamarin.iOS, Xamarin.iOS Classic).Maintenant, j'ai trouvé une solution de travail:
La source
la source
À propos de la discussion sur les propriétés imbriquées, vous pouvez éviter tous les éléments de réflexion si vous utilisez la
DataBinder.Eval Method (Object, String)
méthode ci-dessous:Bien sûr, vous devrez ajouter une référence à l'
System.Web
assembly, mais ce n'est probablement pas un gros problème.la source
La méthode à appeler a changé dans .NET Standard (à partir de 1.6). Nous pouvons également utiliser l'opérateur conditionnel nul de C # 6.
la source
? operator
Utilisation de PropertyInfo de l' espace de noms System.Reflection . La réflexion se compile très bien, quelle que soit la propriété à laquelle nous essayons d'accéder. L'erreur se produira pendant l'exécution.
Cela fonctionne très bien pour obtenir la propriété Location d'un objet
Nous obtiendrons l'emplacement: {X = 71, Y = 27} Nous pouvons également retourner location.X ou location.Y de la même manière.
la source
C'est un moyen d'obtenir toutes les propriétés avec leurs valeurs dans une liste.
la source
type.GetProperty(pi.Name)
quand c'est == à la variablepi
?if
et faitesselfValue?.ToString()
autrement. Débarrassez-vousif
et utilisezselfValue==null?null:selfValue.ToString()
List<KeyValuePair<
est étrange, utilisez un dictionnaireDictionary<string, string>
Le code suivant est une méthode récursive pour afficher la hiérarchie entière de tous les noms et valeurs de propriété contenus dans l'instance d'un objet. Cette méthode utilise une version simplifiée d'AlexD
GetPropertyValue()
réponse ci-dessus dans ce fil. Grâce à ce fil de discussion, j'ai pu comprendre comment faire ça!Par exemple, j'utilise cette méthode pour afficher une explosion ou un vidage de toutes les propriétés dans une
WebService
réponse en appelant la méthode comme suit:la source
la source
la source
La méthode ci-dessous fonctionne parfaitement pour moi:
Pour obtenir la valeur de la propriété:
Pour définir la valeur de la propriété:
la source
la source
Voici une autre façon de trouver une propriété imbriquée qui ne nécessite pas la chaîne pour vous indiquer le chemin d'imbrication. Nous remercions Ed S. pour la méthode de la propriété unique.
la source
Type.GetProperty
retoursnull
au lieu d'appelerGetValue
et d'avoirNullReferenceException
jeté dans une boucle.Vous ne mentionnez jamais quel objet vous inspectez, et puisque vous rejetez ceux qui font référence à un objet donné, je suppose que vous voulez dire un objet statique.
Notez que j'ai marqué l'objet qui est inspecté avec la variable locale
obj
.null
signifie statique, sinon réglez-le sur ce que vous voulez. Notez également que c'est l'GetEntryAssembly()
une des quelques méthodes disponibles pour obtenir l'assembly "en cours d'exécution", vous voudrez peut-être jouer avec si vous avez du mal à charger le type.la source
Jetez un œil à la bibliothèque Heleonix.Reflection . Vous pouvez obtenir / définir / invoquer des membres par des chemins, ou créer un getter / setter (lambda compilé en délégué) qui est plus rapide que la réflexion. Par exemple:
Ou créez un getter une fois et cachez-le pour le réutiliser (ceci est plus performant mais peut lever NullReferenceException si un membre intermédiaire est nul):
Ou si vous souhaitez créer un
List<Action<object, object>>
des différents getters, spécifiez simplement les types de base pour les délégués compilés (les conversions de type seront ajoutées dans les lambdas compilés):la source
manière plus courte ....
la source
jheddings et AlexD ont tous deux écrit d'excellentes réponses sur la façon de résoudre les chaînes de propriétés. Je voudrais jeter la mienne dans le mix, car j'ai écrit une bibliothèque dédiée exactement à cet effet.
La classe principale de Pather.CSharp est
Resolver
. Par défaut, il peut résoudre les entrées de propriétés, de tableau et de dictionnaire.Ainsi, par exemple, si vous avez un objet comme celui-ci
et que vous voulez obtenir
Property2
, vous pouvez le faire comme ceci:Il s'agit de l'exemple le plus simple des chemins qu'il peut résoudre. Si vous voulez voir ce qu'il peut d'autre ou comment l'étendre, rendez-vous simplement sur sa page Github .
la source
Voici ma solution. Il fonctionne également avec les objets COM et permet d'accéder aux éléments de collection / tableau à partir d'objets COM.
la source
Voici ce que j'ai obtenu sur la base d'autres réponses. Un peu exagéré pour devenir si spécifique avec la gestion des erreurs.
la source