通用接口

时间:2010-01-29 23:38:32

标签: c# generics interface generic-interface

这是我的代码

public interface ITranslator<E, R>
{       
    E ToEntity<T>(R record);
}

class Gens : ITranslator<string, int>
{
    #region ITranslator<string,int> Members

    public string ToEntity<MyOtherClass>(int record)
    {
        return record.ToString();
    }

    #endregion
}

编译时,我收到错误Type parameter declaration must be an identifier not a type

为什么我不能拥有ToEntity<MyOtherClass>但只能拥有ToEntity<T> ??

编辑:MyOtherClass在做什么?我在多个表/类之间转换实体(相当于实体框架的POCO)和记录(框架返回的对象)。所以我想用它来进行我的类特定转换

3 个答案:

答案 0 :(得分:9)

您的界面有一个通用的ToEntity<T>方法,您在实现类Gens中将其作为ToEntity<MyOtherClass>的非通用方法。T。 (泛型方法可以使用任何类型参数,可能在Gens上给出某些约束。您的ToEntity类正在尝试为MyOtherClass 提供定义仅适用于类型参数Gens ,这违背了泛型的目的。)

在您的代码示例中,不清楚您的MyOtherClass类是如何尝试使用ToEntity类型的;它当然没有参与ITranslator<E, R>的逻辑。我们需要更多信息才能为您提供更多指导。

为了说明,这是您当前对R界面的定义所提供的内容,用简单的英语:

  

“我提供了翻译机制   任何类型E的记录到实体中   类型为T此机制为   取决于任何用户指定的类型   Gens “。

另一方面,你的MyOtherClass课程,它的设计方式,“实现”上述界面,如下所示:

  

“我可以将整数转换为字符串。   我提供允许的幻觉   用户指定要控制的类型   如何执行此翻译,但是   实际上没有类型的选择。   涉及Gens课程   不知何故;这就是我能说的全部。“

从这两个描述中可以清楚地看出ITranslator<E, R>并没有真正做ToEntity接口保证。也就是说,它不愿意为其{{1}}方法接受用户指定的类型。这就是为什么这段代码不会为你编译的原因。

答案 1 :(得分:2)

您必须对泛型类型声明约束。

public string ToEntity<T>(int record) where T : MyOtherClass

答案 2 :(得分:1)

在LINQpad中为我编译好。也许你在某个地方有一个名为E,R或T的类型?

啊,我看到你要做的事情......你把MyOtherClass定义为一个类,但是你试图将它作为ToEntity中的一个类型参数。您希望MyOtherClass如何参与ToEntity?