J'ai une classe: Constants.cs

Code:

namespace DataAccess.Utilities
{
  public class Constants
  {
    public enum ReturnCode
    {
      Fail = -1,
      Success = 0,
      Warning = 1
    }
  }
}

Ceci est mon code pour la classe de diffusion directe

public static T DirectCast<T>(object o) where T : class
{
    T value = o as T;
    if (value == null && o != null)
    {
        throw new InvalidCastException();
    }
    return value;
}

Voici mon code qui obtient une erreur

code = DirectCast<Constants.ReturnCode>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

Message d'erreur:

Erreur 2 Le type 'DataAccess.Utilities.Constants.ReturnCode' doit être un type de référence pour pouvoir l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'DataAccess.DataManager.QueueingManager.DirectCast (object)'

Avant d'utiliser DirectCast à partir de .net vb, mais DirectCast n'existe pas dans c # donc j'essaye de rechercher et j'obtiens quelques codes sur la façon de créer DirectCast qui a la même fonction à vb.

-3
Codename Red 21 avril 2017 à 10:35

3 réponses

Meilleure réponse
code = DirectCast<Constants.ReturnCode>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

Devrait être changé en:

code = DirectCast<Constants>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

Ou, faites-le comme ceci: voir l'exemple de travail:

class Program
{
    static void Main(string[] args)
    {
        var fail = Constants.DirectCast<Constants.ReturnCode>(-1);
        var success = Constants.DirectCast<Constants.ReturnCode>(0);
        var warning = Constants.DirectCast<Constants.ReturnCode>(1);
        Console.WriteLine(fail);
        Console.WriteLine(success);
        Console.WriteLine(warning);
        Console.ReadLine();
    }
}

public class Constants
{
    public enum ReturnCode
    {
        Fail = -1,
        Success = 0,
        Warning = 1
    }

    public static T DirectCast<T>(object o)
    {
        T value = (T)o;
        if (value == null && o != null)
        {
            throw new InvalidCastException();
        }
        return value;
    }
}
0
ronaldm 21 avril 2017 à 08:02

Dans .NET, il existe des types valeur et des types référence. Les classes sont des types de référence par exemple, elles sont comme des pointeurs en C ++. int sont des types valeur, des énumérations également. Dans les génériques, seuls les types référence peuvent être utilisés comme arguments de type.

Vous pouvez supprimer la généricité de votre méthode mais vous ne pourrez pas connaître le type de retour. De plus, "as" ne fonctionnera pas avec enum car c'est un type valeur.

Je ne comprends pas pourquoi vous voulez lancer une énumération, vous pouvez l'analyser:

Enum.Parse(typeof(Constants.ReturnCode), db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));
1
Clément Picou 21 avril 2017 à 08:02

Merci pour les commentaires. enfin mon code fonctionne.

 public class Constants
 {
    public enum ReturnCode
    {
        Fail = -1,
        Success = 0,
        Warning = 1
    }
 }


 public static T DirectCast<T>(object o)
    {
        T value= (T)o;
        if (value== null && o != null)
        {
            throw new InvalidCastException();
        }
        return value;
    }


 code = Constants.DirectCast<Constants.ReturnCode>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));
0
Codename Red 21 avril 2017 à 09:37