c# - 如何解决以下示例的装箱或转换错误?
问题描述
在下面的代码中;
CustomClass<EnType1> a = new CustomClass<EnType1>();
CustomClass<TEnum<EnType1>> b = new CustomClass<TEnum<EnType1>>();
抛出错误
该类型
ConsoleApp2.TEnum<ConsoleApp2.EnType1>
不能用作T
泛型类型或方法中的类型参数CustomClass<T>
。没有从ConsoleApp2.TEnum<ConsoleApp2.EnType1>
到的隐式引用转换System.Enum
。并且该类型ConsoleApp2.EnType1
不能用作T
泛型类型或方法中的类型参数CustomClass<T>
。ConsoleApp2.EnType1
从到没有拳击转换ConsoleApp2.IEnum
。
我该如何解决这个问题?
基本上我想创建一个通用类,我应该能够使用任何 Enum,然后是任何继承自的类IEnum
任何帮助表示赞赏
完整代码:
class Program
{
static void Main(string[] args)
{
CustomClass<EnType1> a = new CustomClass<EnType1>();
CustomClass<TEnum<EnType1>> b = new CustomClass<TEnum<EnType1>>();
TEnum<EnType2> t = new TEnum<EnType2>(EnType2.B);
Console.WriteLine("Hello World!" + t.EnumValue);
}
}
在这个泛型类中,我应该能够使用任何 Enum,然后是从 IEnum 继承的任何类
public class CustomClass<T> where T : Enum, IEnum
{
public T Enum;
}
enum EnType1
{
A = 2,
B = 3
}
enum EnType2
{
A = 0,
B = 1
}
public interface IEnum
{
public int EnumValue { get; set; }
}
public class TEnum<T> : IEnum
{
public TEnum(T enumVal)
{
EnumValue = (int)(object)enumVal;
}
public int EnumValue { get ; set ; }
}
解决方案
使用OneOf,您可以创建一个自定义类,它表示内置枚举或自定义枚举。
public class EitherEnum : OneOfBase<Enum, IEnum>
{
public EitherEnum(OneOf<Enum, IEnum> _)
: base(_) { }
public bool IsStandard => IsT0;
public Enum Standard => AsT0;
public bool IsCustom => IsT1;
public IEnum Custom => AsT1;
}
您不能使用OneOf<T1,T2>
,因为它是一个struct
并且不能用作通用约束。同样适用于Language-ext的Either类型。
通过这个小类,您可以执行以下操作:
public class CustomClass<T> where T : EitherEnum
{
public T Enum;
}
CustomClass<EitherEnum> cc = new CustomClass<EitherEnum>();
cc.Enum = new EitherEnum(EnType1.A);
//OR
cc.Enum = new EitherEnum(new CustomEnum());
cc.Enum.Switch(
standard => Console.WriteLine($"Standard: {standard}"),
custom => Console.WriteLine($"Custom: {custom}"));
//OR
if(cc.Enum.IsStandard)
Console.WriteLine($"Standard: {cc.Enum.Standard}")
else if (cc.Enum.IsCustom)
Console.WriteLine($"Custom: {cc.Enum.Custom}")
推荐阅读
- docker - Jenkins 不等待 docker exec 命令完成
- java - 如何修复错误“反编译的 .class 文件字节码版本 52.0 (Java 8)
- linear-regression - “show.std”函数删除 tab_plot (sjPlot) 中的 p 值格式
- java - 使用 Java 生成文件
- excel - VBA Excel 以灵活的名称保存 .xlsx 文件
- mongodb - 在聚合期间围绕匹配查询对数据进行分区
- kubernetes - 使用 kubectl 连接到远程 kubernetes 集群时由未知权威签署的证书
- php - 从预先加载的模型中选择字段
- sql - 有没有办法阻止查询设置串行主键?
- python - 如何根据熊猫滚动窗口中的多列查找重复项?