Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# generic constraint for Type to be castable

Tags:

c#

generics

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 registry value...
    T objectValue = (T)regValue;
    return objectValue ;
}
like image 479
Avi Turner Avatar asked Jul 24 '13 06:07

Avi Turner


1 Answers

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 ;
}
like image 110
Sergey Berezovskiy Avatar answered Oct 11 '22 06:10

Sergey Berezovskiy