2010-03-01 7 views
10

es posible hacer algo como lo siguiente:¿Puedo crear accesos en estructuras para convertir automáticamente a/desde otros tipos de datos?

struct test 
{ 
    this 
    { 
     get { /*do something*/ } 
     set { /*do something*/ } 
    } 
} 

de manera que si alguien trató de hacer esto,

test tt = new test(); 
string asd = tt; // intercept this and then return something else 
+2

No entiendo la pregunta. –

+0

@ John Knoeller: actualizó la pregunta – caesay

+3

Parece que quiere un operador de conversión ... – Shog9

Respuesta

7

Conceptualmente, lo que quiere hacer aquí es de hecho posible dentro de .NET y C#, pero usted está ladrando al árbol equivocado con respecto a la sintaxis. Parece una implicit conversion operator sería la solución aquí,

Ejemplo:

struct Foo 
{ 
    public static implicit operator string(Foo value) 
    { 
     // Return string that represents the given instance. 
    } 

    public static implicit operator Foo(string value) 
    { 
     // Return instance of type Foo for given string value. 
    } 
} 

Esto le permite asignar y volver cuerdas (o cualquier otro tipo) en/desde los objetos de su tipo personalizado (Foo aquí) .

var foo = new Foo(); 
foo = "foobar"; 
var string = foo; // "foobar" 

Los dos operadores de conversión implícitas no tienen que ser simétrica, por supuesto, aunque por lo general es aconsejable.

Nota: También hay operadores de conversión explicit, pero creo que está más interesado en los operadores implícitos.

+0

@sniperX: debe crear una nueva instancia de Foo, basada en la cadena. – Shog9

+0

Sí, Shog9 tiene razón. Si no desea exponer el constructor directamente, no hay problema con solo hacerlo privado/protegido. – Noldorin

2

Puede definir implicit y explicit operadores de conversión hacia y desde el tipo personalizado.

public static implicit operator string(test value) 
{ 
    return "something else"; 
} 
0

Ampliando MikeP's answer que quieren algo como:

public static implicit operator Test(string value) 
{ 
    //custom conversion routine 
} 

o

public static explicit operator Test(string value) 
{ 
    //custom conversion routine 
} 
Cuestiones relacionadas