2011-01-21 15 views
8

¿Hay alguna manera en C# de agregar conversiones implícitas a tipos ya definidos en otros ensamblados?C# agregando conversiones implícitas a los tipos existentes

Por ejemplo, si estoy utilizando dos ensamblajes diferentes que cada uno proporciona su propio Vector3 struct y lo uso en sus API, sería bueno poder definir una conversión una vez, y luego pasar un Foo.Vector3 a un método que espera un Bar.Vector3 y lo tiene convertido automáticamente.

Si tuviera el origen de las bibliotecas, podría agregar operadores de conversión implícitos. Sin esa fuente, actualmente estoy haciendo la conversión explícitamente con una función auxiliar siempre. Estoy esperando una manera más agradable.

que se dan cuenta de que podía crear mi propia Vector3 struct con los operadores de conversión implícitas hacia y desde las otras dos estructuras, pero esto no resolvería todos los casos en los que quiero directamente pasar un objeto de un (definido externamente) tipo a un método esperando el otro.

Pregunta extra: ¿hay algo que los autores de bibliotecas que exponen cosas como una estructura Vector3 en su API deberían hacer para facilitar la facilidad de uso en este sentido?

+0

operadores de extensión .. Me encanta :) – nawfal

Respuesta

10

Puede proporcionar conversiones implícitas desde y hacia un tipo de terceros para cualquier tipo que usted mismo autorice, pero no puede agregar compatibilidad para la conversión implícita entre dos tipos de terceros.

Podría mejorar la elegancia de la conversión entre los dos tipos añadiendo métodos de extensión a ambos tipos de Vector3;

public static Bar.Vector3 ToBarVector3(this Foo.Vector3 foo) { 
    return /* instance of Bar.Vector3 */ 
} 

public static Foo.Vector3 ToFooVector3(this Bar.Vector3 bar) { 
    return /* instance of Foo.Vector3 */ 
} 

Eso es lo mejor que puede esperar lograr.

2

Desafortunadamente, no puede agregar conversiones implícitas que se convierten a un tipo que no se puede cambiar. Hubiera recomendado la solución que mencionaste, pero ya lo mencionaste :).

Me temo que incluso la respuesta a su pregunta de bonificación es "usted no puede".

Cuestiones relacionadas