2012-07-17 16 views
5

¿Cómo puedo almacenar un tipo en un campo estático, por lo que yo puedo hacer algo como esto (nota: sólo un ejemplo, en pseudocódigo) ?:Tipo tienda en el campo/variable de

public class Logger 
{ 
    public static Type Writer; 

    public static void SetWriter(Type @new) 
    { 
     Writer = @new; 
    } 

    public static void Write(string str) 
    { 
     Writer.Write(str); 
    } 
} 
+0

¿Qué estás tratando de lograr? no en el código sino como una idea abstracta? –

+0

Estoy tratando de almacenar un Tipo en cualquier tipo de variable, pero un Tipo en sí mismo no es una declaración, por lo que no funciona ... – Jwosty

+1

¿No puedes usar una instancia de algún tipo, en lugar de ' Tipo'? Tal vez algo así como 'TextWriter'? – svick

Respuesta

2

A excepción de la hecho de que new es una palabra clave, su código para almacenar el tipo debería funcionar bien.

Sin embargo, su código

Writer.Write(str); 

no tiene sentido.

La clase Type no tiene un método Write(string).

Se siente como lo que está después es un interface

public interface IWriter 
{ 
    public Write(string text); 
} 

public class Logger 
{ 
    public static IWriter Writer; 

    public static void SetWriter(IWriter newWriter) 
    { 
     Writer = newWriter; 
    } 

    public static void Write(string str) 
    { 
     Writer.Write(str); 
    } 
} 

De esta manera, usted pasaría cualquier clase que implemente IWriter en SetWriter, por ejemplo,

public class MyWriter : IWriter 
{ 
    public void Write(string text) 
    { 
     // Do something to "write" text 
    } 
} 

Logger.SetWriter(new MyWriter()); 
+0

He cambiado la publicación para describir mejor mi situación exacta – Jwosty

0

Bueno, ese código de ejemplo, no tiene sentido, pero ¿por qué no simplemente usar una interfaz común? Por ejemplo, todos (creo que todos al menos) de los tipos de escritura de texto en el espacio de nombres hereda System.IO de la clase abstracta TextWriter, así que ...

Por ejemplo:

public class Logger 
{ 
    public Logger(TextWriter writer) 
    { 
     _writer = writer; 
    } 

    private TextWriter _writer;  

    public void Write(string text) 
    { 
     _writer.Write(text); 
    } 
} 

Ahora, se trata de una ¿Es buena idea hacer público al escritor y confiar en los usuarios de su código para asegurarse de que siempre sea válido? Probablemente no, pero eso es más una consideración de diseño. Además, tu setter de estilo java es A) atípico para C# que tiene un buen soporte sintáctico para las propiedades, y B) inútil ya que el campo de respaldo es público de todos modos.

11

muy simple:

Type variableName = typeof(SomeTypeName); 

o

Type variableName = someObject.GetType(); 

No estoy seguro que va a ayudar con lo que realmente quiere hacer, sin embargo. Ver las otras respuestas

Cuestiones relacionadas