抽象类调用泛型方法 - 不会编译

时间:2012-10-29 18:11:37

标签: c# generics

我遇到编译时错误,我的方法调用有一些无效的参数。

public abstract class EntityBase
{
    public virtual List<ValidationResult> Validate<T>()
    {
        // This line causes the error:
        var validationResults = this.ValidateEntity<T>(this, true).ToList();
    }

    protected IEnumerable<ValidationResult> ValidateEntity<T>(T entity, bool ignoreNullViolations)
    {
        // Code here
    }
}

这门课是抽象的。那应该没问题。我尝试在方法签名中指定T的类型,但这没有帮助。为什么不编译?我无法将this传递给期望T参数的方法吗?

编辑 - 可能的解决方案:

public virtual List<ValidationResult> Validate<T>() where T : class
{
    var validationResults = this.ValidateEntity<T>(this as T, true).ToList();
}

编辑2

由于T应该只是一个子类,我认为类签名应该更改为泛型,以便强制子类设置它。然后通过this就不会那么黑了。

1 个答案:

答案 0 :(得分:5)

宣布您的ValidateEntity方法,使第一个参数的类型为T

现在看看你是怎么称呼的:

var validationResults = this.ValidateEntity<T>(this, true).ToList();

您是否试图将this隐式转换为T - 是什么让您认为应该工作?

假设我打电话:

foo.Validate<string>();

那会尝试将this传递给一个有效期望string的方法 - 这显然不会起作用,因为this是对{的某个具体子类的实例的引用{1}} - 对字符串的引用。