J'ai une méthode avec un paramètre out qui essaie de faire une conversion de type. En gros:.NET: Comment obtenez-vous le type d'un objet nul?
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());
}
Le problème est que généralement quelqu'un appellerait cela comme:
string output;
GetParameterValue(output);
Cela échouera en raison de:
destination.GetType()
destination est nulle, nous ne pouvons pas appeler .GetType()
dessus. Nous ne pouvons pas non plus appeler:
typeof(destination)
car la destination est un nom de variable et non un nom de type.
Alors, est-il possible d'obtenir le type d'un objet qui est défini sur null? Je pense qu'il devrait y avoir un moyen de savoir quel est le type d'un emplacement de stockage sans qu'on lui attribue quoi que ce soit.
Juste pour donner un peu plus d'infos, je suis en train de faire une méthode utilitaire qui va récupérer les paramètres de sortie d'une procédure stockée Oracle. Le problème est que DbParameter.Value
est de type objet.
Quel serait idéal serait pour les développeurs de faire quelque chose comme:
string val = GetParameterValue("parameterName");
La chose remarquable est qu'il n'y a pas coulée de types. Dans la pratique, vous ne connaissez pas le lparam du « égaux », alors je suis allé avec:
string val;
GetParameterValue("parameterName", out val);
Et figuré dans la méthode, je sais le type de destination de la variable de sortie. Je suppose que c'était une mauvaise hypothèse. Comme alternative, je l'ai écrit aussi la méthode:
public T GetParameterValue<T>(string paramName)
Ainsi, les développeurs peuvent faire:
string val = GetParameterValue<string>("parameterName");
Je trouve la déclaration explicite « chaîne » d'être répétitif, d'autant plus que dans la pratique, la destination probablement une propriété d'objet et l'oracle type de données pourraient changer (penser ORM):
MyObj.SomeProp = GetParameterValue<MyObj.SomeProp.GetType()>("parameterName");
Mais encore une fois, si MyObj.SomeProp est nul, que .GetType()
appel échoue. La machine virtuelle doit connaître le type de MyObj.SomeProp
, même si son null, non? ou bien comment attraperait-il des exceptions?
Pour résoudre partiellement mon problème, je peux faire:
MyObj.SomeProp = GetParameterValue<typeof(MyObj).GetField("SomeProp").GetType()>("parameterName");
L'idée était d'avoir de ne pas utiliser explicitement le type dans plus d'un endroit, de sorte que si les changements de type de données , il doit uniquement être modifié dans l'objet de destination (MyObj.SomeProp
) et dans le DB. Il doit y avoir un meilleur moyen ...
Bonne suggestion! Le second argument devrait être typeof (T) et pas typeof (T) .GetType(). – Hallgrim
Malheureusement, le code "out T dest" ne compile pas car il ne trouve pas le type "T". Je vais rechercher cette option un peu plus ... – CodingWithSpike
@ rally25rs: le T est un type générique, dans ce cas ce qui est suggéré est que vous utilisez des génériques pour déterminer le type de la méthode. –