2010-10-07 19 views
20

Espero haberlo omitido en los documentos. ¿Hay alguna manera de declarar un sinónimo de tipo en C#?Declarar un sinónimo de tipo en C#

+1

que significa un alias de un 'string' La verdad es' System.String'? –

+0

sí. MyTuple = Tuple akonsu

Respuesta

18

Usted puede utilizar la instrucción using para crear un alias para un tipo.

Por ejemplo, lo siguiente será crear un alias para System.Int32 llamada MyInt

using MyInt = System.Int32; 

Alternativamente, se puede utilizar la herencia para ayudar en algunos casos. Por ejemplo

Crear un tipo People que es un List<Person>

public class People: List<Person> 
{ 
} 

No es un alias, pero sí simplificar las cosas, especialmente para los tipos más complejos de este tipo

public class SomeStructure : List<Dictionary<string, List<Person>>> 
{ 
} 

y ahora se puede use el tipo SomeStructure en lugar de esa divertida declaración genérica.

Para el ejemplo que tiene en sus comentarios, para un Tuple podría hacer algo como lo siguiente.

public class MyTuple : Tuple<int, string> 
{ 
    public MyTuple(int i, string s) : 
    base(i, s) 
    { 
    } 
} 
+0

Actualice para incluir algunas alternativas, en función de su comentario que hace referencia a Tuple. –

+3

Así que realmente, la respuesta es no, al menos no como en Haskell. 'using' scopes el sinónimo del archivo local, y no puede definir dos sinónimos diferentes para el mismo tipo. La herencia, además de ser _vil_ en sí misma, no se aplica a las clases selladas como String, que son los tipos que usualmente estamos más interesados ​​en crear sinónimos. Una forma adicional de "crear" sinónimos sería la encapsulación o adaptadores. Cree una clase 'MyTuple' que tenga una instancia de' Tuple' oculta adentro, y reenvíe todas las llamadas a ella (por supuesto, debe implementar todas las interfaces del tipo encapsulado). – drozzy

+0

También puede usar extensiones para extender una clase sin tener que heredarla o modificarla directamente. Por ejemplo, puede agregar métodos a la clase String, @drozzy. http://msdn.microsoft.com/en-us/library/bb383977.aspx – ps2goat

8

¿Existe alguna manera de declarar un sinónimo de tipo en C#?

Puede crear un alias con el uso, sino que se limita a la 1 archivo (espacio de nombres).

+0

Hay 1 truco: http://stackoverflow.com/a/41704128/3241228. Esta no es la solución para ningún caso, pero es mejor que nada – user1234567

15

Tal vez usted está buscando Using Alias Directives:

using MyType = MyNamespace.SomeType; 

Esto permite, en su código, tipo:

// Constructs a MyNamespace.SomeType instance... 
MyType instance = new MyType(); 
+1

gracias. una abrumadora cantidad de respuestas. :) Supongo que lo extrañé. aunque una advertencia aquí es que no puedo usar este sinónimo en otros archivos ... eso estaría bien. – akonsu

+1

@akonsu: No, es una compilación en tiempo de compilación, por lo que es por archivo (técnicamente, por unidad de compilación o espacio de nombres; puede ser solo válido para ** parte ** de un archivo, dependiendo de dónde lo haya puesto). Debe copiar esto en cualquier archivo donde desee usarlo. Sin embargo, es lo más parecido que C# tiene a un "sinónimo de tipo". –

3

Suena como si estuviera hablando de un alias que se puede declarar en sus declaraciones using en la parte superior de sus codefiles:

using MyDate = System.DateTime; 
0

Ésta no es la forma más sencilla de resolver este problema pero cuando necesito un sinónimo tipo, creo una clase con conversiones implícitas hacia y desde el tipo de destino, por ejemplo:

El nombre dado necesita ser sinónimo de cadena, Luego puede hacer lo siguiente:

public class Name 
{ 
    public string Value; 
    public static implicit operator string(Name name) { return name.Value; } 
    public static implicit operator Name(string name) { return new Name {Value = name}; } 
} 

Lo que le dará la capacidad de usar el tipo de nombre alrededor de su código y el compilador le permitirá asignarle valores también a partir de una cadena.

Si ha la firma siguiente método:

public void SomeMethodThatNeedsName(Name name) 

Usted puede hacer esto:

SomeMethodThatNeedsName("aNameThatComesFromString") 
Cuestiones relacionadas