C# 将泛型类强制转换为其他类型
注意:我将简化本课程的结构和内容,它在现实中要复杂得多,但其余部分对于当前的问题不是必需的 我有以下(简化的)班级结构:C# 将泛型类强制转换为其他类型,c#,class,generics,casting,C#,Class,Generics,Casting,注意:我将简化本课程的结构和内容,它在现实中要复杂得多,但其余部分对于当前的问题不是必需的 我有以下(简化的)班级结构: public abstract class Config { // A number of abstract parameters and special abstract methods } public class GenericConfig<T> : Config { private DataType configDataType;
public abstract class Config
{
// A number of abstract parameters and special abstract methods
}
public class GenericConfig<T> : Config
{
private DataType configDataType;
public DataType ConfigDataType
{
get { /* A get function */ }
set { /* A set function */ }
}
public T InitialValue { get; set; }
public T MinValue { get; set; }
public T MaxValue { get; set; }
// Overridden parameters and methods
}
public enum DataType
{
Int,
Bool,
Float,
String,
DateTime
}
公共抽象类配置
{
//一些抽象参数和特殊的抽象方法
}
公共类GenericConfig:Config
{
私有数据类型configDataType;
公共数据类型ConfigDataType
{
获取{/*一个获取函数*/}
集合{/*集合函数*/}
}
公共T初始值{get;set;}
公共最小值{get;set;}
公共T最大值{get;set;}
//重写的参数和方法
}
公共枚举数据类型
{
Int,
布尔,
浮动
一串
日期时间
}
当我实例化一个Config
对象时,它如下所示:
Config configInstance=new GenericConfig(…,ConfigDataType=0,…)
我希望能够将int类型转换为float或方法调用中的任何内容。类似于以下内容(我最好遵循我的枚举类型):
configInstance.CastType(“Float”)
或configInstance.CastType(2)
,这将为我提供以下等价物:
Config configInstance=new GenericConfig(…,ConfigDataType=2,…)
这是否是可能的,还是应该避免的?
我认为你可以考虑重新思考或改进你的设计(为什么<代码>配置数据类型>代码>是嵌套的),但是你可以使用操作符显式的铸造:static public explicit operator GenericConfig<int>(GenericConfig<T> value)
{
if ( typeof(T) is int ) return (GenericConfig<int>)value;
return null;
}
static public explicit operator GenericConfig<float>(GenericConfig<T> value)
{
if ( typeof(T) is float ) return (GenericConfig<float>)value;
return null;
}
静态公共显式运算符GenericConfig(GenericConfig值)
{
如果(typeof(T)为int)返回(GenericConfig)值;
返回null;
}
静态公共显式运算符GenericConfig(GenericConfig值)
{
如果(typeof(T)是float)返回(GenericConfig)值;
返回null;
}
创建一个新实例,并通过复制而不是返回null来处理转换
用法:
Config v1=new GenericConfig();
配置v2=(GenericConfig)v1;
GenericConfig
中的泛型参数T
的用法是什么?我将编辑并添加它的用法!抱歉在施放后,最小值、最大值和初始值会发生什么情况?它们也需要更新吗?因为int
和float
有不同的边界。另外,为什么在这里将配置类型设置为0newgenericconfig(…,ConfigDataType=0,…)
?可能是2?是的,您在这两个方面都是正确的,强制转换应该作为全局类型影响T
,因此影响基于它的每个属性(是的,它应该是2,将发生变化)。您可以使用接口转换大多数类型。除了DateTime
,因为向/从数值类型转换会引发异常
Config v1 = new GenericConfig<int>();
Config v2 = (GenericConfig<float>)v1;