J'ai lu que je devrais créer et réutiliser des délégués pour obtenir la valeur d'une propriété d'un objet.Delegate.DynamicInvoke trop lent, comment changer l'appel à Invoke?
J'utilise ce code pour créer le délégué
var objParm = Expression.Parameter(property.DeclaringType, "o");
Type delegateType = typeof(Func<,>).MakeGenericType(property.DeclaringType, property.PropertyType);
var lambda = Expression.Lambda(delegateType, Expression.Property(objParm, property.Name), objParm);
return lambda.Compile()
Maintenant, je trouve que la façon d'utiliser le délégué dans l'appel de « DynamicInvoke ».
Maintenant, je veux changer l'appel à "invoquer" cause des raisons de performance.
J'ai essayé
Delegate.Method.Invoke(invokedObject, null);
Mais après l'appel i obtenir l'exception
MethodInfo must be a RuntimeMethodInfo.
J'ai une classe de cache pour chaque propriété où je peux stocker le délégué créé dynamiquement.
Que dois-je faire, je suis capable d'utiliser des appels "normaux"?
Merci beaucoup.
«J'ai lu que je devrais créer et réutiliser les délégués pour obtenir la valeur d'une propriété d'un objet. » Dans de très rares cas c'est correct, "très" étant le mot clé ici. La plupart du temps, vous devriez juste vous «x.Property». – jason
Oui, vous avez tout à fait raison, était mon erreur dans l'explication. A signifié en cohérence avec la réflexion (GetValue, SetValue). – Khh
Le problème ici est que non seulement le nom de la propriété varie au moment de l'exécution, mais aussi le type. Cela vous oblige à utiliser une invocation basée sur la réflexion lente au lieu d'un appel de délégué de type sécurisé rapide. –