C#泛型是否有办法将类型T限制为可从另一种类型转换?
示例:
假设我将注册表中的信息保存为string
,当我恢复信息时,我想要一个看起来像这样的函数:
static T GetObjectFromRegistry<T>(string regPath) where T castable from string
{
string regValue = //Getting the regisstry value...
T objectValue = (T)regValue;
return objectValue ;
}
答案 0 :(得分:5)
.NET中没有这种类型的约束。只有六种类型的约束可用(参见Constraints on Type Parameters):
where T: struct
类型参数必须是值类型where T: class
类型参数必须是引用类型where T: new()
类型参数必须具有公共无参数构造函数where T: <base class name>
类型参数必须是或来自指定的基类where T: <interface name>
类型参数必须是或实现指定的接口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 ;
}
答案 1 :(得分:0)
在编译期间确定类型。您无法在运行时更改类型。可以将对象强制转换为其基类或子类
参考 -
Difference between object a = new Dog() vs Dog a = new Dog()
答案 2 :(得分:0)
约束拼写为“T的类型必须是U类型或继承类型U”,因此您正在寻找的约束是不可行的。
无论如何 所有都是“可投递”到String
,通过.ToString()
(YMMV)