2012-08-14 56 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