【问题标题】:How can I best enforce generic type constraint conditions?如何最好地执行泛型类型约束条件?
【发布时间】:2011-08-22 11:41:40
【问题描述】:

我写了一个非常简单的类,它带有一个泛型参数,比如T。现在,我想强制T 只能是我的自定义类型ClassAClassBClassC 之一,这样我就不会错误地将它与intlong 等无意义的类型一起使用,甚至我写的其他课程。我认为这样做的一种方法是使这三个类实现相同的空ISomething 接口并在通用类定义中使用where T : ISomething。但是,我不知道这种方法(实现一个空接口)是否有意义。有没有更好的方法来做到这一点?

【问题讨论】:

  • 如果泛型类不能对类型做任何事情,你为什么要强制只能使用你的类型?听起来更像是您想在使用泛型类的类中强制使用类型。
  • 课程不共享某些元素的曝光吗?如果不是,它与泛型类有什么关系?他们之间有什么区别?目前,您的做法听起来远非理想,但实际上并没有足够的信息为您提供有关您应该做什么的详细信息。
  • ClassA 等在这个泛型类中使用的意义何在?

标签: .net generics constraints


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这取决于您希望添加什么样的约束以及您的类执行什么样的操作。

    一般来说,您应该为泛型类使用的类型添加一个约束

    在下面的示例中,泛型类使用在基类中实现的方法 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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多