如何最好地执行泛型类型约束条件?

时间:2011-08-22 11:41:41

标签: .net generics constraints

我写了一个非常简单的类,它采用了一个通用参数,比如T。现在,我想强制T只能是我的自定义类型之一ClassAClassBClassC,这样我就不会错误地将它用于像{一样无意义的类型{1}},int甚至我写的其他类。我认为这样做的一种方法是让这三个类实现相同的空long接口并在泛型类定义中使用ISomething。但是,我不知道这种方法(实现空接口)是否有意义。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

这不起作用。由于T的类型为ISomething,因此您只能访问通用类中ISomething的成员。由于ISomething只是一个没有任何成员的标记界面,所以对你没用 如果您的类共享通用功能,请将此共享功能放入接口。如果他们不这样做,他们不应该实现相同的界面,你应该问自己你的设计是否正确 请举一个更具体的例子,也许我们可以提供更实用的提示。

答案 1 :(得分:1)

这取决于你想要添加什么样的约束以及你的班级做什么样的操作。

通常,您应该为泛型类使用的类型添加约束

在下面的示例中,泛型类使用在基类中实现的方法GetString()。您需要在该类型上添加约束以确保泛型类将找到该方法

 class A
    {
        public string GetString()
        {
            return "A";
        }
    }

    class B : A
    {
        public string GetAnotherString()
        {
            return "B";
        }
    }

    class GenericClass<T> where T:A
    {
        private T _obj;

        public GenericClass(T obj)
        {
            _obj = obj;
        }

        public string GetString()
        {
            return _obj.GetString();
        }
    }

    public class MyClass
    {
        public static void Main()
        {
            GenericClass<A> genericClass=new GenericClass<A>(new B());
            Console.WriteLine(genericClass.GetString());
            Console.Read();
        }
    }