Tengo una clase que actualmente tiene varios métodos que toman parámetros enteros. Estos enteros se asignan a las operaciones que la aplicación puede realizar. Me gustaría hacer la clase genérica para que los consumidores de la clase puedan proporcionar un tipo de enumeración que tengan con todas las operaciones en ella, luego los métodos tomarán parámetros de ese tipo de enumeración. Sin embargo, quiero que sean capaces de no especificar un tipo genérico en absoluto, y tener su valor predeterminado de nuevo a enteros sin ningún cambio en la sintaxis de la forma actual. es posible?¿Cómo se proporciona un tipo predeterminado para genéricos?
Respuesta
No puede hacerlo en la definición de la clase:
var foo = new MyGenericClass(); // defaults to integer... this doesn't work
var bar = new MyGenericClass<MyEnum>(); // T is a MyEnum
Si realmente valorar lo implícito del tipo predeterminado ser int, que tendrá que hacerlo con una fábrica estática método, aunque no veo el valor de esto.
public class MyGenericClass<T>
{
public static MyGenericClass<T> Create()
{
return new MyGenericClass<T>();
}
public static MyGenericClass<int> CreateDefault()
{
return new MyGenericClass<int>();
}
}
Vea a continuación cómo realmente no se beneficia de lo anterior.
var foo = MyGenericClass<MyEnum>.Create();
var bar1 = MyGenericClass.CreateDefault(); // doesn't work
var bar2 = MyGenericClass<int>.CreateDefault(); // works, but what's the point
Si desea llevarlo aún más lejos, se puede crear una clase de fábrica estática que va a resolver esto, pero eso es una solución aún más ridículo si lo haces por ninguna otra razón que para proporcionar un valor predeterminado tipo:
public static class MyGenericClassFactory
{
public static MyGenericClass<T> Create<T>()
{
return new MyGenericClass<T>();
}
public static MyGenericClass<int> Create()
{
return new MyGenericClass<int>();
}
}
var foo = MyGenericClassFactory.Create(); // now we have an int definition
var bar = MyGenericClassFactory.Create<MyEnum>();
Sí, no quiero introducir esa complejidad. El valor predeterminado no es extremadamente importante, simplemente habría sido bueno. No lo hice. Sé de alguna forma de hacerlo, pero quería verificar con todos ustedes primero para asegurarse.gracias por la respuesta –
El compilador puede inferir los argumentos de tipo de métodos mayor parte del tiempo en función del tipo de los argumentos pasado:
public void DoSomething<T>(T test) {
}
puede ser llamado con
DoSomething(4); // = DoSomething<int>(4);
DoSomething(MyEnum.SomeValue); // = DoSomething<MyEnum>(MyEnum.SomeValue);
Por cierto, también puede tener sobrecargas no genéricas de un método genérico.
Estoy buscando que la clase sea "opcionalmente genérica". No creo que sea posible, así que tendré que hacer métodos genéricos con sobrecargas no genéricas ... Estaba buscando este "SecurityContext sec = new SecurityContext();" (que lo crearía utilizando enteros para parámetros, y luego "SecurityContext
Conserve su versión original (versión no genérica) y cree una versión genérica de la misma.
Luego llame a la versión genérica desde su versión no genérica.
void Main()
{
DoSomething(2);
DoSomething(EnumValue);
}
public void DoSomething(int test) {
DoSomething<int>(test);
}
// Define other methods and classes here
public void DoSomething<T>(T test) {
Console.WriteLine(test);
}
El tipo de parámetro genérico será el mismo para todos los métodos, por lo tanto Me gustaría en el nivel de clase. Sé que podría hacer una versión genérica y luego heredarla para la versión int, pero esperaba obtener todo en uno ... pero no sabía de ninguna manera para hacer eso. Supongo que no es posible de la manera más simple que esperaba. –
Entonces ... ¿por qué no utilizar la herencia simple? Al igual que:
class MyGenericClass<T>
{
}
class MyGenericClass : MyGenericClass<int>
{
}
De esta manera usted puede escribir en ambos sentidos:
var X = new MyGenericClass<string>();
var Y = new MyGenericClass(); // Is now MyGenericClass<int>
- 1. ¿Cuál es el valor predeterminado para un campo si no se proporciona un valor predeterminado?
- 2. Genéricos Constructor predeterminado Java
- 3. ¿Hay un tipo MIME "predeterminado"?
- 4. ¿Predeterminado para el tipo genérico?
- 5. valor predeterminado Tipo de recopilación
- 6. ¿Cómo se establece un valor predeterminado para un WTForms SelectField?
- 7. Cómo pasar un tipo a un método - Tipo argumento vs genéricos
- 8. Esquema XML: ¿se establece un valor predeterminado para un tipo complejo?
- 9. Especifique el valor predeterminado para un tipo de referencia
- 10. genéricos de Java - Tipo deducir
- 11. ¿Cómo cambio el tipo predeterminado para deserialización numérica?
- 12. ¿Cómo se configura el RequestFormat predeterminado para un WCF ServiceContract?
- 13. ¿Cómo se usa el constructor no predeterminado para un miembro?
- 14. ¿Cómo se especifica un valor predeterminado para VARIANT_BOOL?
- 15. Por qué el compilador proporciona el constructor de copia predeterminado
- 16. ¿Cómo puedo verificar si un tipo proporciona un constructor sin parámetros?
- 17. cómo obtener el valor predeterminado de un tipo si el tipo solo se conoce como Tipo de sistema?
- 18. Incapacidad para sobrecargar métodos genéricos con restricciones de tipo
- 19. ¿Qué significa "Tipo recursivo obligado" en Genéricos?
- 20. ¿Cómo puedo llamar al valor predeterminado (T) con un tipo?
- 21. ¿Cómo puedo determinar el tipo de variable cuando no se proporciona?
- 22. Genéricos C#: tipo de referencia vs. valor
- 23. Contenedores genéricos de tipo seguro con macros
- 24. ¿Cómo obtengo el valor predeterminado de un tipo genérico?
- 25. advertencia para varargs genéricos
- 26. ¿Los genéricos Can C# tienen un tipo base específico?
- 27. Seguridad tipo, genéricos Java y consultas
- 28. Java parámetro de tipo genéricos ocultar
- 29. genéricos de Java - tipo de recuperación
- 30. Genéricos y convertir al tipo de derecho
no es @ Vilx- solución de un buen enfoque y una mejor respuesta? –