2012-07-13 11 views
5

Mi función requiere que le pase una cadena y un Type como T. Basado en T, quiero analizar el valor de cadena como ese tipo, pero obtengo el error del título de esta pregunta. Cualquiera que tenga alguna idea u otras formas de lograr esta función, lo agradecería enormemente.La restricción no puede ser de clase especial 'System.Object'

T Parse<T>(string val) where T : System.Object 
    { 
     TypeCode code = Type.GetTypeCode(typeof(T)); 
     switch (code) 
     { 
      case TypeCode.Boolean: 
       return System.Boolean.Parse(val); 
       break; 
      case TypeCode.Int32: 
       return Int32.Parse(val); 
       break; 
      case TypeCode.Double: 
       return Double.Parse(val); 
       break; 
      case TypeCode.String: 
       return (string)val; 
       break; 
     } 
     return null; 
    } 
+3

Lo que eres hacer allí es abusar de genéricos. Si va a buscar un tipo, ¿por qué usar genéricos en absoluto? – Oded

+0

posible duplicado de [C# Generics: Restricción T donde T: Object no se compila; Error: La restricción no puede ser un 'objeto' de clase especial] (http://stackoverflow.com/questions/10644703/c-sharp-generics-constraining-t-where-t-object-doesnt-compile-error-constr) – nawfal

Respuesta

15

Acaba de eliminar where T : System.Object.

Al afirmar:

where T : System.Object 

que estás diciendo que los tipos T que pueden usarse en el método de Parse deben heredar de objeto.
Pero, como cada objeto en C# hereda de System.Object, no necesita esa restricción (y probablemente esa sea una de las razones por las que el compilador no permite eso).

También, puesto que usted está volviendo null, debe restricción del tipo T ser un tipo de referencia, por lo que:

where T: class 

Pero de esta manera no se puede devolver un valor booleano, entero o cualquier valor tipo.

Sin embargo, su código, básicamente, imita la funcionalidad de Convert.ChangeType, la única diferencia es que usted está utilizando genéricos para devolver el tipo correcto en lugar de objeto, pero es básicamente igual a este:

T Parse<T>(string val) 
{ 
    return (T)Convert.ChangeType(val,typeof(T)); 
} 
+0

Búsqueda para algo más, pero encontré esta respuesta que resolvió mi problema. –

Cuestiones relacionadas