C#可浇铸类型的通用约束
C#泛型有没有办法将类型C#可浇铸类型的通用约束,c#,generics,C#,Generics,C#泛型有没有办法将类型T限制为可从另一个类型浇铸 示例: 假设我正在将信息以字符串的形式保存在注册表中,当我恢复信息时,我希望有一个类似以下内容的函数: static T GetObjectFromRegistry<T>(string regPath) where T castable from string { string regValue = //Getting the registry value... T objectValue = (T)regValu
T
限制为可从另一个类型浇铸
示例:假设我正在将信息以
字符串的形式保存在注册表中,当我恢复信息时,我希望有一个类似以下内容的函数:
static T GetObjectFromRegistry<T>(string regPath) where T castable from string
{
string regValue = //Getting the registry value...
T objectValue = (T)regValue;
return objectValue ;
}
static T GetObjectFromRegistry(string regPath),其中T可从字符串强制转换
{
string regValue=//正在获取注册表值。。。
T objectValue=(T)regValue;
返回objectValue;
}
类型在编译期间确定。您不能在运行时更改类型。可以将对象强制转换为其基类或子类
参考号-
在.NET中没有此类约束。只有六种类型的约束可用(请参见):
其中T:struct
类型参数必须是值类型
其中T:class
类型参数必须是引用类型
其中T:new()
类型参数必须具有公共无参数构造函数
其中T:
类型参数必须是或派生自指定的基类
其中T:
类型参数必须是或实现指定的接口
其中T:U
为T提供的类型参数必须是或派生自为U提供的参数
若要将字符串强制转换为您的类型,可以先将字符串强制转换为对象。但不能对类型参数施加约束以确保可以进行此转换:
static T GetObjectFromRegistry<T>(string regPath)
{
string regValue = //Getting the regisstry value...
T objectValue = (T)(object)regValue;
return objectValue ;
}
并将其作为约束条件:
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 ;
}
static T GetObjectFromRegistry(字符串regPath)
其中T:IInitializable,new()
{
字符串regValue=//正在获取regisstry值。。。
T objectValue=newt();
InitFrom(regValue);
返回objectValue;
}
约束的含义类似于“T的类型必须是U型或继承U型”,因此您要寻找的约束是不可行的
无论如何,通过.ToString()
(YMMV)对字符串的所有内容都是“可转换的”。NETI中没有此类约束。我意识到类型是在编译时确定的。但在编译时,您现在还可以将类型引用传递给函数。(与.string a=“abc”相同,[0]可以工作,而(a as object)[0]不能工作),因此我不知道这是如何回答这个问题的……YMMV解释说:。ToString()
或多或少是一种内置调试功能。“”-MSDN。我强烈建议不要(ab-)使用它来铸造。
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 ;
}