我有一个通用类longMail
。
在minimumSize(100)(shortMail) // false
minimumSize(100)(longMail) // true
为Foo<T> where T: SomeBaseType
的特定情况下,我希望我的课程有其他方法。
类似的东西:
T
我怎样才能做到这一点?
答案 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