C# 确保泛型方法上的参数是同一类中参数的基

C# 确保泛型方法上的参数是同一类中参数的基,c#,generics,C#,Generics,我有一个泛型类,定义如下: public abstract class BaseValidator<T> : IValidator<T> where T: IEntity { //some methods and parameters here protected void Include<E>(IValidator<E> validator) where E : class , IEntity { if (type

我有一个泛型类,定义如下:

public abstract class BaseValidator<T> : IValidator<T> where T: IEntity
{
   //some methods and parameters here
   protected void Include<E>(IValidator<E> validator) where E : class , IEntity
   {
       if (typeof(E) != typeof(T).BaseType)
       {
            throw new ArgumentException($"Generic class Validator<T> must only Include Validators for base classes");
       }
       //Some business logic around connecting validators
   }
}
where T:E
但是visual studio抱怨方法Include没有定义类型参数“T”

如果我确实定义了一个类型参数,我会收到一条消息,说明类型参数“T”与外部类上的类型参数具有相同的名称

如何确保传入方法的泛型类型是T实现的基类


编辑1:

public class BankAccountValidator : BaseValidator<BankAccount>
    {
        public BankAccountValidator(IValidator<OwnedProduct> validator)
        {
            Include(validator);
            //Some logic here
        }
    }
公共类BankAccountValidator:BaseValidator
{
公共银行账户验证器(IValidator验证器)
{
包括(验证器);
//这里有些逻辑
}
}
在这种情况下,BankAccount实现OwnedProduct。因此,当对BankAccount调用validate方法时,它也会对OwnedProduct调用validate

我想强制您不能将另一个BankAccountValidator传递给BankAccountValidator,或者如果我拥有BankAccount不是从中派生的OwnedCredit类型,我不能将OwnedCreditValidator传递给构造函数

有大量的验证器,使用这种强类型可以防止我遇到运行时问题。

公共抽象类BaseValidator:ivalidater
public abstract class BaseValidator<T, E> : IValidator<T> 
    where E: IEntity
    where T: E
{
   //some methods and parameters here
   protected void Include(IValidator<E> validator)
   {          
       //Some business logic around connecting validators
   }
}

public class BankAccountValidator : BaseValidator<BankAccount, OwnedProduct>
{
    public BankAccountValidator(IValidator<OwnedProduct> validator)
    {
        Include(validator);
        //Some logic here
    }
}
式中E: 其中T:E { //这里有一些方法和参数 受保护的无效包括(IValidator验证器) { //关于连接验证器的一些业务逻辑 } } 公共类BankAccountValidator:BaseValidator { 公共银行账户验证器(IValidator验证器) { 包括(验证器); //这里有些逻辑 } }
如果OwnedProductValidator可以自行验证,则:

public class OwnedProductValidator : IValidator<OwnedProduct>
{ 
    // IValidator interface implementation
}

public class Program
{
    public static void Main()
    {
        var ownedProductValidator = new OwnedProductValidator();                
        var bankAccountValidator = new BankAccountValidator(ownedProductValidator);
    }
}
public类OwnedProductValidator:IValidator
{ 
//IValidator接口实现
}
公共课程
{
公共静态void Main()
{
var ownedProductValidator=新ownedProductValidator();
var bankAccountValidator=新的bankAccountValidator(ownedProductValidator);
}
}
如果OwnedProductValidator需要其他类验证,则:

public class OwnedProductValidator : BaseValidator<OwnedProduct, SomeOtherClass>{}
public类OwnedProductValidator:BaseValidator{}

不能在该类的方法中限制类级别的类型参数,甚至没有多大意义。假设您能够做到这一点,现在
T
应该继承自
E
。然后,添加另一个带有某种类型参数
F
的方法,并说
T
应该从中继承。现在
T
应该继承自
E
F
。如果我理解正确,您应该能够将方法签名更改为
protectedvoid Include(ivalidater validator){…}
?因为已经定义了
T
?不过,可能没有得到。好吧,我删除了我的答案,因为我以前没有收到你的问题。你能给出你的实际代码的用例(没有编译时检查)来理解你为什么需要这个约束吗?@PedroPerez请看我的编辑然后我如何为我的基类使用BaseValidator?OwnedProductValidator的第二个参数是什么?抱歉,我因另一个问题而被忽略,忘记将此标记为答案。我没有完全遵循您的代码,而是将基本验证器保持原样,创建了一个实现基本验证器并具有继承限制的二级类。谢谢