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

有没有一种方式使用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 ;
}

.NET中没有这种类型的约束。 只有六种类型的约束可用(请参阅类型参数的约束):

  • where T: struct类型参数必须是值类型
  • where T: class类型参数必须是引用类型
  • where T: new()类型的参数必须具有公共无参数构造函数
  • where T: <base class name>类型参数必须是或从指定的基类派生
  • where T: <interface name>类型参数必须是或实现指定的接口
  • where T: U为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 ;
    }
    

    类型在编译期间确定。 运行期间不能更改类型。 可以将对象投射到其基类或子类

    Ref -

    对象之间的区别a =新的狗()vs狗a =新的狗()


    约束条件就像“T的类型必须是U类型或继承类型U”一样,所以你正在寻找的约束是不可行的。

    一切都是“浇注”到String无论如何,通过.ToString()因人而异)

    链接地址: http://www.djcxy.com/p/72957.html

    上一篇: C# generic constraint for Type to be castable

    下一篇: Android Google+ unable to get auth code