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的第二个参数是什么?抱歉,我因另一个问题而被忽略,忘记将此标记为答案。我没有完全遵循您的代码,而是将基本验证器保持原样,创建了一个实现基本验证器并具有继承限制的二级类。谢谢