通用接口

发布于 2024-08-20 07:56:21 字数 604 浏览 8 评论 0原文

这是我的代码

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
}

当我编译它时,我得到一个错误类型参数声明必须是标识符而不是类型

为什么我不能有ToEntity但只能有 ToEntity ??

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

Here is my code

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
}

When I compile this, I get an error Type parameter declaration must be an identifier not a type

Why is that I cannot have ToEntity<MyOtherClass> but can only have ToEntity<T> ??

Edit: what is MyOtherClass doing ? I am converting between entities(POCOs equivalent of Entity framework) and record(Object returned by the framework) for multiple tables/classes. So I would want to use this to do my class specific conversion

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

避讳 2024-08-27 07:56:21

您的接口有一个通用 ToEntity 方法,您已在实现类 Gens 中将其设为非通用方法 ToEntity。 (泛型方法可以采用任何类型参数,可能会对 T 给予一定的限制。您的 Gens 类正在尝试为 提供定义>ToEntity 仅适用于类型参数 MyOtherClass,这违背了泛型的目的。)

在您的代码示例中,尚不清楚您的 Gens 类正在尝试使用 MyOtherClass 类型;它当然不涉及 ToEntity 的逻辑。我们需要更多信息才能进一步指导您。

为了说明这一点,以下是您当前对 ITranslator 界面提供的简单英语定义:

“我提供了一种翻译机制
实体中任何 R 类型的记录
E 类型,此机制是
取决于任何用户指定的类型
T
。”

另一方面,您的 Gens 类按照当前的设计方式“实现”了上述接口,如下所示:

“我可以将整数转换为字符串。
我提供了允许的幻觉
用户指定要控制的类型
这个翻译是如何进行的,但是
事实上没有类型的选择。
涉及到MyOtherClass
不知何故;我只能说这么多。”

从这两个描述中,很明显 Gens并没有真正执行 ITranslator 接口所保证的<也就是说,它不愿意接受用户为其 ToEntity 方法指定的类型,这就是无法为您编译此代码的原因。

Your interface has a generic ToEntity<T> method that you've made non-generic in your implementation class Gens as ToEntity<MyOtherClass>. (A generic method could take any type parameter, possibly given certain constraints on T. Your Gens class is trying to provide a definition for ToEntity only for the type parameter MyOtherClass, which defeats the purpose of generics.)

In your code example, it's unclear how your Gens class is trying to use the MyOtherClass type; it's certainly not involved in the logic of ToEntity. We'd need more information to be able to guide you further.

To illustrate, here's what your current definition of the ITranslator<E, R> interface offers, in plain English:

"I provide a mechanism to translate
any record of type R into an entity
of type E, this mechanism being
dependent upon any user-specified type
T
."

Your Gens class, on the other hand, the way it's currently designed, "implements" the above interface like so:

"I can translate integers to strings.
I provide the illusion of allowing
the user to specify a type to control
how this translation is performed, but
in fact there is no choice of type.
The MyOtherClass class is involved
somehow; that's all I can say."

From these two descriptions, it's clear that the Gens class is not really doing what the ITranslator<E, R> interface guarantees. Namely, it is not willing to accept a user-specified type for its ToEntity method. That's why this code won't compile for you.

国粹 2024-08-27 07:56:21

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

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

You must declare a constraint on a generic type.

public string ToEntity<T>(int record) where T : MyOtherClass
数理化全能战士 2024-08-27 07:56:21

这对我来说在 LINQpad 中编译没问题。也许你在某处有一个名为 E、R 或 T 的类型?

啊,我明白你想要做什么...你在某处将 MyOtherClass 定义为类,但你试图将它用作类型ToEntity 中的参数。您究竟希望 MyOtherClass 如何参与 ToEntity?

That compiles OK for me in LINQpad. Maybe you have a type named E, R, or T somewhere?

Ahh I see what you're trying to do... you have MyOtherClass defined as a class somewhere yet you're trying to use it as a type argument in ToEntity. How exactly do you want MyOtherClass involved in ToEntity?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文