-3

我有一堂课:Constants.cs

代码:

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

这是我的直接广播类代码

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;
}

这是我的错误代码

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

错误信息:

错误 2 类型“DataAccess.Utilities.Constants.ReturnCode”必须是引用类型才能将其用作泛型类型或方法“DataAccess.DataManager.QueueingManager.DirectCast(object)”中的参数“T”

在我从 .net vb 使用 DirectCast 之前,但 DirectCast 在 c# 中不存在,所以我尝试搜索并获得一些关于如何创建与 vb 具有相同功能的 DirectCast 的代码。

4

3 回答 3

1

在 .NET 中,有值类型和引用类型。例如,类是引用类型,它们就像 C++ 中的指针。int 是值类型,枚举也是。在泛型中,只有引用类型可以用作类型参数。

您可以删除方法的通用性,但您将无法知道返回类型。此外,“as”不适用于枚举,因为它是一种值类型。

我不明白你为什么要投射一个枚举,你可以解析它:

Enum.Parse(typeof(Constants.ReturnCode), db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));
于 2017-04-21T08:02:52.093 回答
0

感谢您的评论。最后我的代码有效。

 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()));
于 2017-04-21T09:37:16.373 回答
0
code = DirectCast<Constants.ReturnCode>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

应改为:

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

或者,这样做:参见工作示例:

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;
    }
}
于 2017-04-21T07:51:08.793 回答