在C#</t>中的通用方法中正确使用<t>类型

时间:2013-03-26 10:36:11

标签: c# generics

所以我真正的方法有很多不同,但我会谈到这一点。在我使用泛型方法时,似乎我不完全理解如何处理泛型<T>类型。我的理解是,当我们希望相同的逻辑适用于不同类型时,我们使用泛型方法,但我们希望在运行时自由确定确切的类型。因此,当我有这样的方法时,我觉得很自然:

internal static void ChangeCode<T>(Entity entity) where T : Entity
{

    T tempEntity;

    if (entity.GetType() == typeof(SomeMoreSpecificEntity))
    {
      tempEntity = new SomeMoreSpecificEntity();
    }
}

但是如果我尝试这样的话,我会收到错误Can not convert type T to SomeMoreSpecificEntity

所以我错了。是不是能够做到这一点 - 在编译时声明一个通用类型并在运行时转换为更具体的类型?

3 个答案:

答案 0 :(得分:4)

你做不到。检查以下情况:

你有另一个名为SomeMoreSpecificEntity2的类,它被声明为:

class SomeMoreSpecificEntity2 : Entity
{
}

您调用方法ChangeCode<SomeMoreSpecificEntity2>,因此TSomeMoreSpecificEntity2,因此tempEntity也是SomeMoreSpecificEntity2,但您正在尝试分配SomeMoreSpecificEntity 1}}到它。那不行。

您可以尝试将其更改为:

internal static void ChangeCode<T>(Entity entity) where T : Entity
{
    Entity tempEntity;

    if (entity.GetType() == typeof(SomeMoreSpecificEntity))
    {
        tempEntity = new SomeMoreSpecificEntity();
    }
}

它编译。<​​/ p>

答案 1 :(得分:3)

不,您尝试编写的代码已损坏。例如,假设我打电话:

ChangeCode<BananaEntity>(new SomeMoreSpecificEntity());

这会尝试将SomeMoreSpecificEntity类型的引用分配给T类型的变量,其中TBananaEntity

目前尚不清楚您要实现的目标,但这就是您当前代码无法编译的原因。鉴于你实际上并不是使用 T而不是为了它无法正常工作的目的,你可以更改当前代码以使其成为非泛型方法,只需将tempEntity声明为Entity类型。当然,这可能不适用于您真正想要做的事情,但由于您只提供了非工作代码,因此很难确定:(

关于这一行的三点:

if (entity.GetType() == typeof(SomeMoreSpecificEntity))
  • 您是否真的认为entity属于T类型而非类型Entity?目前它可以是任何实体
  • 您真的想检查完全类型吗?通常情况下,您使用is而不是调用GetType并将其直接与类型进行比较
  • 通常比较这样的类型是您应该考虑重新设计的标志。在这一点上,它绝对不是泛型,因为它只处理硬编码的类型。

答案 2 :(得分:-3)

tempEntity = (T)(object)new SomeMoreSpecificEntity();

T只能使用对象

进行转换