类型可转换的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 ;
}

类型可转换的C#通用约束

.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