C#扩展方法中的通用约束

Jon*_*Jon 4 .net c# 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 class ValidationExtensions
{
    public static void IsValid<T>(this T parent) where T : class
    {
        throw new NotImplementedException("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这并没有阻止某人这样做 "this is a dumb idea".IsValid();

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

更新:我试图解释的是通过命名空间强制执行约束,因为有一个字符串调用IsValid是哑的,我只想要某些模型类集

Ree*_*sey 9

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

public static void IsValid<T>(this T parent) where T : Person
Run Code Online (Sandbox Code Playgroud)

但是,没有理由这样做,因为您可以轻松地写:

public static void IsValid(this Person parent)
Run Code Online (Sandbox Code Playgroud)

  • ...老实说,因为他可以控制类,所以最好将它设为Person的实例方法,除非必须以这种方式验证除Person及其后代之外的类. (2认同)
  • @Jon如果这适用于所有模型类,则需要某种类型的基类,如Entity等. (2认同)

SLa*_*aks 5

这些限制正在得到执行.
string是一个班级.


Ale*_*kov 1

C#(以及整个 .Net)中的命名空间是纯粹的语法糖,可以使类名看起来更短。因此,您想要的是“通过类全名的子字符串限制泛型”,这在 C# 中不受支持。

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