4

拡張メソッドを提供したいのですが、それを何と呼ぶことができるかについて、ある種の防止策があります。

これは私が持っているものです:

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を呼び出す文字列を持つことは愚かであり、特定のモデルクラスのセットのみが必要だからです。

4

3 に答える 3

9

Personインスタンス (および から派生した型) でのみ機能するように制約する場合はPerson、次のようにします。

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

ただし、次のように簡単に書くこともできるため、これを行う理由はありません。

public static void IsValid(this Person parent)
于 2012-08-14T18:25:20.070 に答える
5

制約適用されています。
stringクラスです。

于 2012-08-14T18:24:05.733 に答える
1

C#(および.Net全体)の名前空間は、クラス名を短く見せるための純粋な構文糖衣です。その結果、C#ではサポートされていない「クラスのフルネームのサブ文字列によるジェネリックの制限」が必要になります。

すでに提案したように、他の方法ではなく、意味のあるクラスにのみメソッドを提供することをお勧めします。

于 2012-08-14T18:41:49.930 に答える