Como operadores C# p. +, + =, == son invalidables. Me permite pensar que son una especie de métodos, por lo tanto, me pregunto si hay una manera de llamarlos usando la reflexión, en Int32, por ejemplo.¿Es posible llamar operadores de tipo de valor a través de la reflexión?
Respuesta
Sí, los operadores personalizados son invocables mediante la reflexión (tienen nombres especiales, como op_Addition), pero System.Int32 no los define, ya que los tipos fundamentales, integrados, se manejan directamente mediante códigos de operación IL como add
, en lugar de llamadas a métodos.
¿qué son los operadores de molde personalizados nombrados? –
Contestación propia de respuesta: resulta que son "op_Implicit" y "op_Explicit" y pueden tener varias versiones con el mismo nombre, que difieren solo en el tipo de devolución. –
Sería muy ineficiente si agregar o comparar dos enteros requiriera una llamada a un método para que estas simples operaciones sobre los tipos fundamentales sean generadas por código como se explica en otra respuesta y no se pueda invocar utilizando la reflexión. Un interesante tipo de valor incorporado es decimal
(o System.Decimal
). Este struct
tiene soporte para valores literales en C#, pero se comporta como un tipo de valor real real y expone una gran cantidad de operadores que se pueden invocar a través de la reflexión.
Si tiene curiosidad puede usar Reflector para buscar a todos los miembros expuestos por System.Int32
.
Existen buenas respuestas aquí, por lo que acaba de añadir algo aún no he mencionado:
una estructura podría tener un operator overloaded. Esto significa más opciones para verificar si intenta crear algún enfoque programático.
Una cosa agradable de probar es probar el enfoque del árbol de expresiones. Here es una pequeña muestra. Por supuesto, el rendimiento no es muy bueno, pero de todos modos sabemos en qué nos estamos metiendo con Reflection.
¿Qué es exactamente lo que quieres hacer? Tratar con los diversos significados de los operadores (primitivo (asignado a instrucciones específicas de IL), personalizado (asignado a métodos estáticos) y elevado (proporcionado como un patrón por el compilador) hace que esto sea doloroso. Si solo desea use los operadores, entonces es posible escribir código que brinde soporte al operador a través de genéricos. Tengo un código para esto que está disponible gratuitamente en MiscUtil (description and examples).
A modo de ejemplo sin tipo (una nota que esto no es enormemente eficiente, pero funciona):
object x = 123, y = 345; // now forget that we know that these are ints...
object result = Expression.Lambda<Func<object>>(
Expression.Convert(Expression.Add(
Expression.Constant(x), Expression.Constant(y)),
typeof(object))).Compile()();
En realidad, quería implementar un Add (objeto a la izquierda, objeto a la derecha) donde el valor devuelto usa el tipo del argumento de la izquierda. Esto es para una evaluación de expresión, y como es dinámica, no hay forma de escribir el código directamente. –
En ese caso, te encantará 'dynamic' en 4.0; hará más o menos esto ... –
tiene que estar en desacuerdo al optar por 4.0 ya que el trabajo de Seb se centra y es un gran logro cuando se compara con la hinchazón y la invención de Expression Trees. A juzgar por el rendimiento de DLR y sus bits de contención, solo hace que la inminente liberación de PDC sea el marco más lento en la historia de la humanidad. –
¿Qué hay de esto, es simple, pequeño y funciona :)
public T Add<T>(object x, object y)
{
return (T)Convert.ChangeType((dynamic)x + (dynamic)y, typeof(T));
}
Esto funcionó maravillosamente en mi aplicación. La primera vez que he usado realmente "dinámico" también. ¡Me gusta! – Boinst
- 1. ¿Es posible establecer propiedad privada a través de la reflexión?
- 2. C#: Obtener valor a través de la reflexión
- 3. Obtener valor de enumeración a través de la reflexión
- 4. ¿Es posible en Java acceder a campos privados a través de la reflexión
- 5. método de llamada a través de la reflexión, cuando el argumento es de tipo Object []
- 6. ¿Es posible obtener el organismo privado de una propiedad a través de la reflexión?
- 7. ¿Cómo obtengo el tipo de devolución de un tipo delegado a través de la reflexión?
- 8. Cómo llamar a un método genérico a través de la reflexión
- 9. Operadores de comparación de mapas para llamar a la función
- 10. Cómo acceder el valor de un campo a través de la reflexión (Scala 2.8)
- 11. Acceder al valor de la variable final estática de Java a través de la reflexión
- 12. La detección de un tipo anulable a través de la reflexión
- 13. ¿Cómo obtener el valor de un argumento de método a través de la reflexión en Java?
- 14. ¿Es posible iterar a través de JSONArray?
- 15. ¿Cómo puedo obtener un tipo de un conjunto referenciado a través de la reflexión
- 16. ¿Es posible la inyección a través de Dynamic LINQ?
- 17. Obtener el valor de un campo estático público a través de la reflexión
- 18. una acción para cualquier tipo de evento a través de la reflexión
- 19. Uso de C# con OpenOffice a través de la reflexión
- 20. Reflexión sobre restricciones de tipo
- 21. ¿Es posible sobrecargar a los operadores en C?
- 22. C# - Método de valor del tipo de valor: ¿por qué el compilador utiliza la reflexión?
- 23. ¿Es posible la transmisión a través de TCP?
- 24. Cómo obtener el tipo contenido en una colección a través de la reflexión
- 25. Invocando métodos con parámetros opcionales a través de la reflexión
- 26. Obtener contenido tipo en una lista <T> a través de la reflexión?
- 27. ¿Puedo establecer un valor en una estructura a través de la reflexión sin boxeo?
- 28. Cambiar campos final privado a través de la reflexión
- 29. .NET propiedad privada a través de la reflexión
- 30. Obtener MethodBase actual a través de la reflexión
Los operadores no pueden * anular *. Pueden estar * sobrecargados *. Hay una gran diferencia. –
Para ser más claro, la anulación le permite redefinir la implementación, la sobrecarga le permite agregar otro método con el mismo nombre pero con diferentes parámetros. Gracias por el comentario. –
Respondió para comentar y agregó un ejemplo no tipado. –