C#扩展方法中的一般约束

C#扩展方法中的一般约束,c#,.net,generics,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 cla

我想提供一个扩展方法,但有一些可以称之为预防的方法

这就是我所拥有的:

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");
    }
}
使用系统;
公开课考试
{
公共静态void Main()
{
人员p=新人员();
p、 IsValid();
}
}
公共阶层人士
{
公共字符串名称{get;set;}
}
公共静态类ValidationExtensions
{
公共静态void有效(此T父级),其中T:class
{
抛出新的NotImplementedException(“测试”);
}
}
然而,这并不能阻止某人做“这是一个愚蠢的想法”

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

更新:我试图解释的是强制约束,例如通过名称空间,因为字符串调用IsValid是愚蠢的,我只想要一组特定的模型类

强制约束。

string
是一个类。

如果要将其约束为只处理
Person
实例(以及从
Person
派生的类型),可以执行以下操作:

public static void IsValid<T>(this T parent) where T : Person
C#(以及整个.Net)中的名称空间是纯粹的语法糖,可以使类名看起来更短。因此,您需要的是“通过类全名的子字符串限制泛型”,这在C#中不受支持


如前所述,您可能希望仅为有意义的类提供该方法,而不是以其他方式提供该方法。

。。。老实说,既然他控制了这个类,最好是将其作为Person的实例方法,除非Person及其子类以外的类必须以这种方式进行验证。@KeithS确切地说,它不仅仅是Person和派生类型。这是所有型号的classes@Jon如果这适用于所有模型类,则需要某种类型的基类,如实体等。。。。或定义接口,如IValidatableModelClass,用于GTC。同样,接口也可以很容易地要求在所有实现上定义IsValid()方法,这可以通过像Reed所说的从基类派生来实现?下面是一个不错的例子()。我是PostSharp的忠实粉丝,因为它能促进您的AOP愿望。@JTorres感谢您的关注。我知道,但我想基于名称空间为您的AOP实施example@Jon在C语言中没有这样做的方法#
public static void IsValid(this Person parent)