“class”不包含“方法”的定义,但它在那里

´class´ does not contains a definition for ´method´ but it´s there

我有一个class如下

public class EntityBase
{
    // other code
    public virtual void SetDataContext(IDataContext context) { throwNotImplemented("SetDefaultDataContext"); }

    protected void throwNotImplemented( string mname )
    {
        throw new Exception( String.Format( "Method {0} is not implemented") );                
    }
}

throwNotImplemented 的目的是强制派生的 classes 实现虚拟方法,就好像它们是抽象的一样。

然后我有一个class引用了EntityBase,如下

public class BasePresenter<IDataContextFactory, IDataContext, EntityBase> 
        where IDataContextFactory : class, new() where IDataContext : class where EntityBase : class
{
    public IDataContext dataContext;
    public BasePresenter( IDataContext dc, EntityBase sample)
    {
        dataContext = dc;
        sample.SetDataContext(dataContext);
    }
// more code 
}

编译器卡在这个错误中:

'EntityBase' 不包含 'SetDataContext' 的定义,也没有扩展方法...等等

谁或什么错了?

TIA

在您的泛型 class 中,标识符 EntityBase 代表一个泛型参数。这从作用域中隐藏了名为 EntityBase 的 class。特别是,这意味着

I have a class that references EntityBase

错了。

由于通用参数 EntityBase 的唯一约束是 : class,因此您可以使用的唯一成员是在 object 上找到的成员,例如 GetHashCode()GetType(), 和 ToString().

您将 EntityBase 用作 <> 中的通用类型参数,并将其约束为类型 "class" 的后代。所以任何class。因此,编译器无法知道 EntityBase 是否是您的 EntityBase class 的实际继承体。您可能想要做的只是从 <>.

之间剥离 EntityBase 泛型类型