C# generic constraint for Type to be castable

Is there a way with C# generics to limit a type T to be castable from another type?

Example :
Lets say I am saving information in the registry as a string , and when I restore the information I would like to have a function that looks something like that:

static T GetObjectFromRegistry<T>(string regPath) where T castable from string 
{
    string regValue = //Getting the regisstry value...
    T objectValue = (T)regValue;
    return objectValue ;
}

There is no such type of constraints in .NET. There is only six types of constraints available (see Constraints on Type Parameters):

  • where T: struct type argument must be a value type
  • where T: class type argument must be a reference type
  • where T: new() type argument must have a public parameterless constructor
  • where T: <base class name> type argument must be or derive from the specified base class
  • where T: <interface name> type argument must be or implement the specified interface
  • where T: U type argument supplied for T must be or derive from the argument supplied for U
  • If you want to cast string to your type, you can do casting to object first. But you can't put constraint on type parameter to make sure this casting can occur:

    static T GetObjectFromRegistry<T>(string regPath)
    {
        string regValue = //Getting the regisstry value...
        T objectValue = (T)(object)regValue;
        return objectValue ;
    }
    

    Another option - create interface:

    public interface IInitializable
    {
        void InitFrom(string s);
    }
    

    And put it as constraint:

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

    Types are determined during compilation. You can't change the types during runtime. It is possible to cast object to its base or child class

    Ref -

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


    Constraints spell out like "the type of T must either be of type U or inherit type U", so the constraint you are looking for isn't doable.

    everything is "castable" to String anyway, through .ToString() (YMMV)

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

    上一篇: Ember JS和多个单页应用程序

    下一篇: 类型为可转型的C#通用约束