2012-08-14 39 views
3

我想提供一种扩展方法,但在可以调用它的方面有一些预防措施。C#扩展方法中的通用约束

这是我有:

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对象,但我不希望。有什么办法来强制实施这些限制吗?

UPDATE:我正在试图解释是命名空间来执行,例如限制因为有一个字符串调用的IsValid是愚蠢的,我只希望某些组模型类

+0

你为什么不想要? – neontapir 2012-08-14 18:25:03

+0

也许你应该看看AOP?这是一个体面的例子(http://geekswithblogs.net/thomasweller/archive/2009/11/15/validating-business-objects-with-aop-1-the-domain.aspx)。我是PostSharp的忠实粉丝,以推动您的AOP愿望。 – 2012-08-14 18:28:02

+0

@JTorres谢谢你会看看 – Jon 2012-08-14 18:31:52

回答

2

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

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

5

作为约束强制执行。
string是一类。

+0

我知道,但我想基于名称空间强制执行例如 – Jon 2012-08-14 18:31:22

+0

@Jon在C# – 2012-08-14 18:31:51

8

如果要约束它只是Person实例(和类型从Person派生)工作,你可以这样做:

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

但是,没有理由要做到这一点,你可以很容易地也写:

public static void IsValid(this Person parent) 
+2

中没有办法做到这一点......并且诚实地说,因为他拥有对类的控制权,它会是更好的做法是将其作为Person的实例方法,除非Person和它的后代以外的类必须通过这种方式进行验证。 – KeithS 2012-08-14 18:27:43

+0

@KeithS正好,它不只是Person和派生类型。这是所有的模型类 – Jon 2012-08-14 18:31:02

+2

@Jon如果这是所有模型类,你将需要一些类型的基类,如实体等。 – 2012-08-14 18:31:32