9

Is there anyway to force a constraints for a generic definition to implement a "generic interface" ... that is, I want the class to support passing an interface and a generic class constraining it so that the class implements the interface. For example if I say:

MyGenericClass<IMyInterface, MyImplementation>.DoSomething();

That should be constrained so that MyImplementation implements IMyInterface

As far as I know that can be achieved by

public class Dynamic_Loader<T, S> where S: T

Now, is there anyway to also force T to be an interface?

Edit: The purpose of this was to have something like:

private static List<T> interfaceList = new List<T>();

public static List<T> InterfaceList {get { return interfaceList;}}

public static void Add(S input) { interfaceList.Add(input);}

and have the list restricted to only interfaces (since it is supposed to return implementations of certain interfaces)

John Saunders
  • 160,644
  • 26
  • 247
  • 397
Jorge Córdoba
  • 51,063
  • 11
  • 80
  • 130

3 Answers3

8

Do you mean, can a constraint also be put on T like where T : interface?

If so, then no: this list pretty much covers your options.

What you have is as close as it gets, I believe.

Out of curiosity, what would be your reason for wanting to constrain T to be an interface?

Or do you mean can a constraint also be put on T for T to implement some specific interface?

If so, then yes: simply have two where clauses (e.g., where S : T where T : U).

Dan Tao
  • 125,917
  • 54
  • 300
  • 447
  • Oh, I was going for this: public static List interfacelist = new List; public static void Add(S input); And yeah, it will work too if T is just a base class but the client should be getting interfaces, not base classes. – Jorge Córdoba Aug 30 '10 at 13:29
3
where T: IMyOtherInterfaceForT

Example:

    public class Test<T, V>
    where T : V
    where V : IEnumerable<int>
    {
    }
Tokk
  • 4,499
  • 2
  • 31
  • 47
2

You could do something like this to enforce it at runtime instead of compile time.

public class Test<T> where T : class
{
  public Test()
  {
    Type t = typeof( T );
    if( !t.IsInterface )
      throw new ArgumentException( "T must be an interface type" );
  }
}
ScottS
  • 21
  • 1