Tengo un método con un parámetro out que intenta hacer una conversión de tipo. Básicamente:.NET: ¿Cómo se obtiene el tipo de objeto nulo?
public void GetParameterValue(out object destination)
{
object paramVal = "I want to return this. could be any type, not just string.";
destination = null; // default out param to null
destination = Convert.ChangeType(paramVal, destination.GetType());
}
El problema es que por lo general alguien llamaría a esto como:
string output;
GetParameterValue(output);
Esto va a fracasar por:
destination.GetType()
destino es nula, por lo que no se puede llamar .GetType()
en él. Tampoco podemos llamar:
typeof(destination)
porque el destino no es un nombre de variable de un nombre de tipo.
Entonces, ¿hay alguna manera de obtener el tipo de un objeto que se establece en nulo? Pensaría que tendría que haber una manera de saber qué tipo es una ubicación de almacenamiento sin que se le asigne nada.
Sólo para dar un poco más de información, que estoy tratando de hacer un método de utilidad que va a agarrar los parámetros de salida de un procedimiento almacenado de Oracle. El problema es que DbParameter.Value
es de tipo objeto.
Qué sería lo ideal sería que los desarrolladores a hacer algo como:
string val = GetParameterValue("parameterName");
Lo notable es que no hay una fundición de tipos. En la práctica, no se sabe la lparam de la "iguales", así que fui con:
string val;
GetParameterValue("parameterName", out val);
y pensamos que dentro del método, me gustaría saber el tipo de destino de la variable de salida. Supongo que fue una mala suposición. Como alternativa, también escribí el método:
public T GetParameterValue<T>(string paramName)
Así que los desarrolladores pueden hacer:
string val = GetParameterValue<string>("parameterName");
puedo encontrar la declaración explícita "cadena" de ser repetitivo, sobre todo porque en la práctica, el destino si probablemente una propiedad de objeto y el tipo de datos de Oracle podrían cambiar (piensa ORM):
MyObj.SomeProp = GetParameterValue<MyObj.SomeProp.GetType()>("parameterName");
Pero de nuevo, si MyObj.SomeProp es nulo, que .GetType()
llamada falla. La máquina virtual tiene que saber el tipo de MyObj.SomeProp
, incluso cuando es nulo, ¿verdad? o de lo contrario, ¿cómo captaría las excepciones de lanzamiento?
Para resolver parcialmente mi propio problema, que puedo hacer:
MyObj.SomeProp = GetParameterValue<typeof(MyObj).GetField("SomeProp").GetType()>("parameterName");
La idea era no tener que utilizar explícitamente el tipo en más de un lugar, por lo que si cambia el tipo de datos , solo tiene que cambiarse en el objeto de destino (MyObj.SomeProp
) y en la base de datos. Tiene que haber una mejor manera ...
¡Buena sugerencia! El segundo argumento debe ser typeof (T) y no typeof (T) .GetType(). – Hallgrim
desafortunadamente ese código "out T dest" no se compila porque no puede encontrar el tipo "T". Investigaré esta opción un poco más ... – CodingWithSpike
@ rally25rs: la T es un tipo genérico, en este caso lo que se sugiere es que use genéricos para determinar el tipo de método. –