类型可转换的C#通用约束
本文关键字:约束 可转换 类型 | 更新日期: 2023-09-27 18:24:32
C#泛型有没有办法限制类型T
可以从另一个类型中转换?
示例:
假设我将信息保存在注册表中作为string
,当我恢复信息时,我希望有一个类似的函数:
static T GetObjectFromRegistry<T>(string regPath) where T castable from string
{
string regValue = //Getting the registry value...
T objectValue = (T)regValue;
return objectValue ;
}
.NET中没有这样类型的约束。只有六种类型的约束可用(请参阅类型参数上的约束):
where T: struct
类型参数必须是值类型where T: class
类型参数必须是引用类型where T: new()
类型参数必须具有公共的无参数构造函数where T: <base class name>
类型参数必须是指定的基类或派生自指定的基类where T: <interface name>
类型参数必须是或实现指定的接口- 为T提供的
where T: U
类型参数必须是为U提供的参数或派生自该参数
如果您想将字符串强制转换为您的类型,您可以先执行对对象的强制转换。但您不能对类型参数进行约束以确保可以进行这种强制转换:
static T GetObjectFromRegistry<T>(string regPath)
{
string regValue = //Getting the regisstry value...
T objectValue = (T)(object)regValue;
return objectValue ;
}
另一个选项-创建界面:
public interface IInitializable
{
void InitFrom(string s);
}
并将其作为约束:
static T GetObjectFromRegistry<T>(string regPath)
where T: IInitializable, new()
{
string regValue = //Getting the regisstry value...
T objectValue = new T();
objectValue.InitFrom(regValue);
return objectValue ;
}
类型是在编译过程中确定的。在运行时不能更改类型。可以将对象投射到其基类或子类
参考-
对象a=new Dog()与Dog a=new Dog()之间的差异
约束的拼写方式类似于"T的类型必须是类型U或继承类型U",因此您要查找的约束是不可行的。
所有都可以通过.ToString()
(YMMV)
String