¿Alguien puede decirme cómo puedo implementar Llamar por nombre en C#?¿Cómo implementar una llamada por nombre en C#?
Respuesta
Usted puede hacer que el uso de Reflection:
using System; using System.Reflection; class CallMethodByName { string name; CallMethodByName (string name) { this.name = name; } public void DisplayName() // method to call by name { Console.WriteLine (name); // prove we called it } static void Main() { // Instantiate this class CallMethodByName cmbn = new CallMethodByName ("CSO"); // Get the desired method by name: DisplayName MethodInfo methodInfo = typeof (CallMethodByName).GetMethod ("DisplayName"); // Use the instance to call the method without arguments methodInfo.Invoke (cmbn, null); } }
Esto no es por llamada. http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name –
El OP probablemente se refiere a http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name, que es diferente de llamar dinámicamente a un método basado en el nombre. –
Dado que aceptaron esta respuesta, sospecho que OP se estaba refiriendo a los delegados de [CallByName] de VB.NET (https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.interaction.callbyname) – isedwards
Si se refiere a this, entonces creo que el equivalente más cercano sería delegados.
? ¿Puedes explicar cómo? ¿quieres decir, simplemente usando un delegado? –
El ejemplo de Ron Warholic es un ejemplo de un delegado. –
Pase una función lambda en lugar de un valor. C# se evalúa con entusiasmo, por lo que para diferir la ejecución de modo que cada sitio vuelva a evaluar los argumentos proporcionados, debe envolver los argumentos en una función.
int blah = 1;
void Foo(Func<int> somethingToDo) {
int result1 = somethingToDo(); // result1 = 100
blah = 5;
int result2 = somethingToDo(); // result = 500
}
Foo(() => blah * 100);
Usted puede utilizar la clase Lazy si estás en .NET 4.0 para obtener un efecto similar (pero no idéntico). Lazy
memoriza el resultado para que los accesos repetidos no tengan que volver a evaluar la función.
Para aquellos que se preguntan, usar 'Lazy
Una función lambda es una forma de generar un 'delegado'. –
@Steven: De hecho, sin embargo, en términos estrictos, las lambdas no son delegadas, sino implícitamente convertibles en tipos de delegados coincidentes. –
Por qué no usar
Microsoft.VisualBasic.Interaction.CallByName
public enum CallType
{
/// <summary>
/// Gets a value from a property.
/// </summary>
Get,
/// <summary>
/// Sets a value into a property.
/// </summary>
Let,
/// <summary>
/// Invokes a method.
/// </summary>
Method,
/// <summary>
/// Sets a value into a property.
/// </summary>
Set
}
/// <summary>
/// Allows late bound invocation of
/// properties and methods.
/// </summary>
/// <param name="target">Object implementing the property or method.</param>
/// <param name="methodName">Name of the property or method.</param>
/// <param name="callType">Specifies how to invoke the property or method.</param>
/// <param name="args">List of arguments to pass to the method.</param>
/// <returns>The result of the property or method invocation.</returns>
public static object CallByName(object target, string methodName, CallType callType, params object[] args)
{
switch (callType)
{
case CallType.Get:
{
PropertyInfo p = target.GetType().GetProperty(methodName);
return p.GetValue(target, args);
}
case CallType.Let:
case CallType.Set:
{
PropertyInfo p = target.GetType().GetProperty(methodName);
p.SetValue(target, args[0], null);
return null;
}
case CallType.Method:
{
MethodInfo m = target.GetType().GetMethod(methodName);
return m.Invoke(target, args);
}
}
return null;
}
- 1. Ejemplo de llamada por nombre
- 2. ¿Cómo implementar una "devolución de llamada" en Ruby?
- 3. ¿Cómo implementar lambda como una función llamada "lambda" en Clojure?
- 4. Diferencia entre llamada por nombre y llamada por referencia
- 5. jQuery función de llamada por su nombre
- 6. ¿Cómo implementar una interfaz C# en F #?
- 7. ¿Cómo implementar una macro genérica en C?
- 8. C# - Cómo implementar IEnumerator en una clase
- 9. Cómo implementar una matriz enorme en C
- 10. Cython: implementar devoluciones de llamada
- 11. ¿Por qué debería implementar ICloneable en C#?
- 12. rendimiento en las bibliotecas de registro Scala llamada por valor vs llamada por nombre
- 13. Cómo encontrar el nombre completo del método de llamada C#
- 14. Cómo implementar la devolución de llamada user_loader en Flask-Login
- 15. ¿Cómo implementar MapReduce en C# usando PLINQ?
- 16. ¿Cómo implementar una estructura de datos DOM genérica en C++?
- 17. Cómo implementar glob en C#
- 18. cómo implementar interfaces en C++?
- 19. ¿Cómo implementar una función "privada/restringida" en C?
- 20. ¿Cómo implementar una pila estructurada por gráficos?
- 21. ¿Cómo puedo implementar una clase de C++ en Python para ser llamado por C++?
- 22. C++: ¿Cómo implementar un tiempo de espera para una llamada de función arbitraria?
- 23. Cómo implementar la encapsulación condicional en C#
- 24. Cómo contestar una llamada por adb
- 25. ¿Cómo implemento una devolución de llamada en C++?
- 26. Sincronización de una llamada asincrónica en C#
- 27. C# - Cómo hacer una llamada HTTP
- 28. ¿Cómo implementar el mecanismo de devolución de llamada en Rserve?
- 29. limitador de velocidad una función llamada en rails por usuario
- 30. nombre de la llamada del método contenido en una cadena
¿Qué versión de C# está usando (lo que es la versión de Visual Studio)? –
Un compilador en C#, ¿quién lo hubiera probado? –
@ 0xA3: No importa, debería ser como un compilador o algo así ... –