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

C#泛型有没有办法将类型
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 ;
}