C# - 泛型类中的方法,对T有附加约束

时间:2018-05-17 14:07:23

标签: c# oop generics

我有一个通用类longMail

minimumSize(100)(shortMail) // false minimumSize(100)(longMail) // true Foo<T> where T: SomeBaseType的特定情况下,我希望我的课程有其他方法。

类似的东西:

T

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:7)

Foo<T>制作extension method

public static void SpecialMethod<T>(this Foo<T> foo)
    where T : SpecificDerivedType
{
}

答案 1 :(得分:4)

  

我怎样才能做到这一点?

你不能。创建专门的Foo

class SpecialFoo<T> : Foo<T> where T: SpecificDerivedType
{
    void SpecialMethod()
    {
        //...code...
    }
}

其他建议extension method,这显然与你提出的不一样。这可能是一种解决方法。

答案 2 :(得分:4)

没有任何相似之处,但 可以<{1}}在Foo<T>上添加extension method,其具有比T通常具有的更具体的约束。这是一个完整的例子:

using System;

class SomeBaseType {}
class SomeDerivedType : SomeBaseType {}

static class FooExtensions
{
    public static void Extra<T>(this Foo<T> foo)
        where T : SomeDerivedType
    {
        Console.WriteLine("You have extra functionality!");
    }
}

class Foo<T> where T : SomeBaseType
{
}

class Program
{
    static void Main(string[] args)        
    {
        Foo<SomeBaseType> foo1 = new Foo<SomeBaseType>();
        Foo<SomeDerivedType> foo2 = new Foo<SomeDerivedType>();

        // Doesn't compile: the constraint isn't met
        // foo1.Extra();

        // Does compile
        foo2.Extra();
    }
}

这允许您在现有实例上调用该方法,而不必创建更专业的实例。另一方面,它依赖于具有足够访问权限的扩展方法来执行Foo<T>中所需的任何操作。您可能需要在internal {{}}}中使用不受约束的Foo<T>方法才能调用FooExtensions.Extra

答案 3 :(得分:2)

您可以创建一个如下所示的extension method

public static void SpecificMethod<T>(this Generic<T> instance) 
    where T : SpecificDerivedType