泛型 c#.net

3
在下面的代码中,“where T:WsgTypes.RouteRestriction”,我可以添加多个类,以便T只能是我感兴趣的那几种类类型吗?
    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();
    }

这不是泛型方法的设计初衷。如果只有几种可能性,那么一开始就不要使用泛型方法。如果只有三种可能的类型,那么就编写三个不同的方法。泛型是为那些类型真正通用的情况而设计的——可以是无限数量的任何类型之一。 - Eric Lippert
6个回答

5

我认为这不是泛型的正确使用方式。如果 TicketTypeRouteRestriction 实现了一些 IDetailed 接口会更好。


是的,那是我一般描述的详细版本 :) - OregonGhost

4

不可以,泛型类型约束只能指定一个基类。

你可以指定多个接口,但这是“全部”,而不是“任意”的。

使用重载是可以实现你的需求,但不能用泛型。


1
请参阅这篇文章...

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

...有关约束的更多信息。您可以添加多个约束,并且可以通过某些接口或某些基类进行约束,但不能通过任意类列表进行约束。

以下是多个约束的示例(来自上文):

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

该文章解释了如何为同一类型使用多个约束 - 即泛型参数必须实现它们全部。 - OregonGhost
你的示例解释了不同类型参数的不同约束 - 这可能不是Miral想要的。 - OregonGhost

1

对于继承,您可以拥有一个具有多个接口的单个类。

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

相反,您可以拥有一个接口,并有多个类实现它。

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

1

恐怕你不能这样做。通常的方法是提供一个公共接口,所有你感兴趣的类都实现它。问题在于,在泛型体内,编译器希望泛型类型参数是明确的。

嗯,或者你可以将对象作为参数并随意转换它。但是...不要这样做。

请注意,除了 typeof,你还可以使用 isas 运算符。


0

你尝试过像这样分开它们吗:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接