Je veux apprendre la méthode dynamique et son exemple pratique en utilisant C#.
Existe-t-il une relation entre la méthode dynamique et la réflexion?
S'il vous plaît aidez-moi.Exemple pratique de méthode dynamique?
Répondre
Vous pouvez créer une méthode via la classe DynamicMethod.
DynamicMethod squareIt = new DynamicMethod(
"SquareIt",
typeof(long),
methodArgs,
typeof(Example).Module);
ILGenerator il = squareIt.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Conv_I8);
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Mul);
il.Emit(OpCodes.Ret);
Fully commented example on MSDN
Je dois souligner que le développement de cette méthode est très lent et pas très utile.
@ VMAtm .. j'avais lu un article de DynamicMethod, quelque part j'ai trouvé qu'ils sont plus rapides que réflexion.DynamicMethod aussi ils éliminent le besoin d'écrire le code personnalisé de sérialisation et de désérialisation. – Pankaj
Je veux dire la vitesse de développement - il n'est pas très rapide et très difficile de maintenir un tel code. – VMAtm
ILGenerator - fait partie de System.Reflection.Emit Dans un peu c'est une relation entre la réflexion et les méthodes dynamiques – VMAtm
Nous utilisons des méthodes dynamiques pour accélérer la réflexion. Voici le code de notre optimiseur de réflexion. il est seulement 10% plus lent que l'appel direct et 2000 fois plus rapide que l'appel de réflexion
public class ReflectionEmitPropertyAccessor
{
private readonly bool canRead;
private readonly bool canWrite;
private IPropertyAccessor emittedPropertyAccessor;
private readonly string propertyName;
private readonly Type propertyType;
private readonly Type targetType;
private Dictionary<Type,OpCode> typeOpCodes;
public ReflectionEmitPropertyAccessor(Type targetType, string property)
{
this.targetType = targetType;
propertyName = property;
var propertyInfo = targetType.GetProperty(property);
if (propertyInfo == null)
{
throw new ReflectionOptimizerException(string.Format("Property \"{0}\" is not found in type "+ "{1}.", property, targetType));
}
canRead = propertyInfo.CanRead;
canWrite = propertyInfo.CanWrite;
propertyType = propertyInfo.PropertyType;
}
public bool CanRead
{
get { return canRead; }
}
public bool CanWrite
{
get { return canWrite; }
}
public Type TargetType
{
get { return targetType; }
}
public Type PropertyType
{
get { return propertyType; }
}
#region IPropertyAccessor Members
public object Get(object target)
{
if (canRead)
{
if (emittedPropertyAccessor == null)
{
Init();
}
if (emittedPropertyAccessor != null) return emittedPropertyAccessor.Get(target);
}
else
{
throw new ReflectionOptimizerException(string.Format("У свойства \"{0}\" нет метода get.", propertyName));
}
throw new ReflectionOptimizerException("Fail initialize of " + GetType().FullName);
}
public void Set(object target, object value)
{
if (canWrite)
{
if (emittedPropertyAccessor == null)
{
Init();
}
if (emittedPropertyAccessor != null) emittedPropertyAccessor.Set(target, value);
}
else
{
throw new ReflectionOptimizerException(string.Format("Property \"{0}\" does not have method set.", propertyName));
}
throw new ReflectionOptimizerException("Fail initialize of " + GetType().FullName);
}
#endregion
private void Init()
{
InitTypeOpCodes();
var assembly = EmitAssembly();
emittedPropertyAccessor = assembly.CreateInstance("Property") as IPropertyAccessor;
if (emittedPropertyAccessor == null)
{
throw new ReflectionOptimizerException("Shit happense in PropertyAccessor.");
}
}
private void InitTypeOpCodes()
{
typeOpCodes = new Dictionary<Type, OpCode>
{
{typeof (sbyte), OpCodes.Ldind_I1},
{typeof (byte), OpCodes.Ldind_U1},
{typeof (char), OpCodes.Ldind_U2},
{typeof (short), OpCodes.Ldind_I2},
{typeof (ushort), OpCodes.Ldind_U2},
{typeof (int), OpCodes.Ldind_I4},
{typeof (uint), OpCodes.Ldind_U4},
{typeof (long), OpCodes.Ldind_I8},
{typeof (ulong), OpCodes.Ldind_I8},
{typeof (bool), OpCodes.Ldind_I1},
{typeof (double), OpCodes.Ldind_R8},
{typeof (float), OpCodes.Ldind_R4}
};
}
private Assembly EmitAssembly()
{
var assemblyName = new AssemblyName {Name = "PropertyAccessorAssembly"};
var newAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var newModule = newAssembly.DefineDynamicModule("Module");
var dynamicType = newModule.DefineType("Property", TypeAttributes.Public);
dynamicType.AddInterfaceImplementation(typeof(IPropertyAccessor));
dynamicType.DefineDefaultConstructor(MethodAttributes.Public);
var getParamTypes = new[] { typeof(object) };
var getReturnType = typeof(object);
var getMethod = dynamicType.DefineMethod("Get",
MethodAttributes.Public | MethodAttributes.Virtual,
getReturnType,
getParamTypes);
var getIL = getMethod.GetILGenerator();
var targetGetMethod = targetType.GetMethod("get_" + propertyName);
if (targetGetMethod != null)
{
getIL.DeclareLocal(typeof(object));
getIL.Emit(OpCodes.Ldarg_1); //Load the first argument
getIL.Emit(OpCodes.Castclass, targetType); //Cast to the source type
getIL.EmitCall(OpCodes.Call, targetGetMethod, null); //Get the property value
if (targetGetMethod.ReturnType.IsValueType)
{
getIL.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box
}
getIL.Emit(OpCodes.Stloc_0); //Store it
getIL.Emit(OpCodes.Ldloc_0);
}
else
{
getIL.ThrowException(typeof(MissingMethodException));
}
getIL.Emit(OpCodes.Ret);
var setParamTypes = new[] { typeof(object), typeof(object) };
const Type setReturnType = null;
var setMethod = dynamicType.DefineMethod("Set",
MethodAttributes.Public | MethodAttributes.Virtual,
setReturnType,
setParamTypes);
var setIL = setMethod.GetILGenerator();
var targetSetMethod = targetType.GetMethod("set_" + propertyName);
if (targetSetMethod != null)
{
Type paramType = targetSetMethod.GetParameters()[0].ParameterType;
setIL.DeclareLocal(paramType);
setIL.Emit(OpCodes.Ldarg_1); //Load the first argument //(target object)
setIL.Emit(OpCodes.Castclass, targetType); //Cast to the source type
setIL.Emit(OpCodes.Ldarg_2); //Load the second argument
//(value object)
if (paramType.IsValueType)
{
setIL.Emit(OpCodes.Unbox, paramType); //Unbox it
if (typeOpCodes.ContainsKey(paramType)) //and load
{
var load = typeOpCodes[paramType];
setIL.Emit(load);
}
else
{
setIL.Emit(OpCodes.Ldobj, paramType);
}
}
else
{
setIL.Emit(OpCodes.Castclass, paramType); //Cast class
}
setIL.EmitCall(OpCodes.Callvirt,targetSetMethod, null); //Set the property value
}
else
{
setIL.ThrowException(typeof(MissingMethodException));
}
setIL.Emit(OpCodes.Ret);
// Load the type
dynamicType.CreateType();
return newAssembly;
}
}
mise en œuvre sont agrégées à partir de différentes sources et principale est cet article CodeProject. Je ne comprends pas le terme _dynamic method_
Merci @@ Sergey Miroda ... onw plus de chose Y at-il une relation entre la méthode dynamique et la réflexion – Pankaj
Oui c'est. Reflection.Emit fait partie de la réflexion .net. –
aussi la méthode dynamique est la méthode __only__ si vous voulez au code de construction d'exécution qui peut être garbage collecté. –
- 1. Exemple Spawning WSGI (approche pratique de WSGI)
- 2. Analyse syntaxique en langage naturel, exemple pratique
- 3. Groovy - AST Transformations, un exemple pratique
- 4. SslStream.BeginRead Méthode exemple
- 5. Meilleur exemple de file d'attente de threads/meilleure pratique
- 6. méthode pratique de l'exploitation forestière ruby
- 7. exemple pratique de sous-chaîne regex Postgres ou regexp_matches
- 8. En savoir plus sur Prolog! Exemple de pratique DCG
- 9. Appel dynamique méthode dans C#
- 10. iPhone, méthode pratique ou Alloc/Release?
- 11. Invocation de méthode dynamique sans réflexion
- 12. Une question sur un exemple en PHP 5 en pratique
- 13. Méthode d'affichage de l'écran de démarrage meilleure pratique C#
- 14. Type dynamique dans le paramètre de méthode
- 15. Appel de méthode statique dynamique en PHP?
- 16. Problème étrange avec l'invocation de méthode dynamique
- 17. Comment cette solution est-elle un exemple de programmation dynamique?
- 18. Exemple de code pour les techniques d'analyse dynamique
- 19. Expression blend 4 exemple de mise en page dynamique
- 20. Exemple: Méthode Objective C avec une méthode php
- 21. C# pratique de programmation
- 22. Substitution dynamique d'une méthode abstraite dans C#
- 23. Bonne pratique ou mauvaise pratique
- 24. Comment rendre la méthode d'extension [exemple] plus générique/fonctionnelle/efficace?
- 25. Méthode dynamique ruby transmettant une valeur
- 26. Comment créer une méthode dynamique en PHP?
- 27. Méthode d'appel dynamique d'une classe avec javascript
- 28. Utilisation de la méthode groupby en Python, exemple inclus
- 29. Exemple pratique de 32 bits non signés, signés, différences de 64 bits
- 30. Bonne pratique de l'interface utilisateur sous Android, existe-t-il un exemple de code?
Delphi a des méthodes dynamiques, pour lesquelles C# n'a pas d'analogie, et il y a une technique de programmation appelée _dynamic programming_. Ou voulez-vous dire _virtual method_? Je suppose, par "Reflation", que vous voulez dire la réflexion. –
aucun homme il n'y a aussi un concept de méthode dynamique dans C# – Pankaj