Miral
Miral

Reputation: 6038

Generics c#.net

In the below code "where T : WsgTypes.RouteRestriction", can I add multiple classes so that T can be of only those few classes types which I am interested of

    public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction
    {
        T details;
        if (typeof(T) == typeof(WsgTypes.TicketType))
        {
            details = TicketTypeDetail.GetDetails(code) as T;

        }
        else if (typeof(T) == typeof(WsgTypes.RouteRestriction))
        {
            details = RouteRestrictionDetail.GetDetails(code) as T;

        }
        else
        {
            throw new NotSupportedException("");
        }
        return details;
        throw new NotImplementedException();
    }

Upvotes: 3

Views: 372

Answers (6)

bruno conde
bruno conde

Reputation: 48265

It seems to me that this isn't a proper use of generics. It would be better if TicketType and RouteRestriction implemented some IDetailed.

Upvotes: 5

Marc Gravell
Marc Gravell

Reputation: 1062502

No, generic type constraints can only specify a single base-class.

You can specify multiple interfaces, but this is "all of", not "any of".

What you ask is possible with overloading, but not with generics.

Upvotes: 4

kyrisu
kyrisu

Reputation: 4643

Did you try separating them like this:

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, NextClass, AnotherClass, AndSoOn
{
...
}

Upvotes: 0

Rashmi Pandit
Rashmi Pandit

Reputation: 23788

For inheritance you can have a single class with multiple interfaces.

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, , IComparable
    {
    }

Instead you can have an interface and have multiple classes implementing it.

public interface IInterface
    {}

    public class Class1: IInterface
    {}

    public class Class2: IInterface
    {}

public static T GetDetails<T>(string code) where T:IInterface
        {
            T instance;
            // ...
            return instance;
        }

Upvotes: 1

Martin Peck
Martin Peck

Reputation: 11544

See this article...

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

... for more information on constaints. You can add multiple constraints, and you can constrain by some interface or by some base class, but not by a list of arbitrary classes.

Here's an example of multiple constraints (from the above):

class Base { }
class Test<T, U>
    where U : struct
    where T : Base, new() { }

Upvotes: 1

OregonGhost
OregonGhost

Reputation: 23759

I'm afraid you can't. The usual way is to provide a common interface that all classes you're interested in implement. The problem is that, inside the generic body, the compiler expects a generic type parameter to be unambigous.

Well, or you could take an object as parameter and cast it at your will. But... no. Don't.

Note that instead of typeof, you could also use the is and as operators.

Upvotes: 1

Related Questions