Type为可强制转换的C#泛型约束

时间:2013-07-24 06:46:10

标签: c# generics

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 ;
}

3 个答案:

答案 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>类型参数必须是或实现指定的接口
  • 为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 ;
}

答案 1 :(得分:0)

在编译期间确定类型。您无法在运行时更改类型。可以将对象强制转换为其基类或子类

参考 -

Difference between object a = new Dog() vs Dog a = new Dog()

答案 2 :(得分:0)

约束拼写为“T的类型必须是U类型或继承类型U”,因此您正在寻找的约束是不可行的。

无论如何

所有都是“可投递”到String,通过.ToString()(YMMV)