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 回答