C#扩展方法中的通用约束

时间:2012-08-14 18:22:30

标签: c# .net generics

我想提供一种扩展方法,但在可以调用它的方面有一些预防。

这就是我所拥有的:

using System;

public class Test
{
    public static void Main()
    {
        Person p = new Person();
            p.IsValid();
    }
}

public class Person
{
    public string Name {get;set;}
}

public static class ValidationExtensions
{
    public static void IsValid<T>(this T parent) where T : class
    {
        throw new NotImplementedException("test");
    }
}

然而,这并没有阻止某人做"this is a dumb idea".IsValid();

我可以使用接口,属性或基类标记Person对象,但我不想这样做。有没有办法强制执行约束?

更新:我试图解释的是强制执行约束,例如命名空间,因为有一个字符串调用IsValid是愚蠢的,我只想要某些模型类集

3 个答案:

答案 0 :(得分:9)

如果您想将其限制为只处理Person个实例(以及从Person派生的类型),您可以执行以下操作:

public static void IsValid<T>(this T parent) where T : Person

然而,没有理由这样做,因为你可以轻松地写:

public static void IsValid(this Person parent)

答案 1 :(得分:5)

强制执行约束 string是一个班级。

答案 2 :(得分:2)

C#中的命名空间(和.Net整体)是纯语法糖,使类名看起来更短。因此,你想要的是“通过类的全名的子字符串来限制泛型”,这在C#中是不受支持的。

正如已经建议的那样,您可能只希望为有意义的类提供方法,而不是采取其他方式。