如何在C#中基于T的类型将泛型返回为精确类型

时间:2019-05-08 12:08:00

标签: c# visual-studio generics types

我的作业C#代码有些麻烦。

问题:我做了一个通用方法,其返回类型为T并带有一个整数参数。该方法的作用如下: -检查T的类型。 -如果类型为ClassA,则应返回ClassA类型。 -如果类型为ClassB,则应返回ClassB类型。 -如果类型为ClassC,则应返回ClassC类型。

我可以用以下代码检查T的类型:

Type theType = typeof(T);

然后我检查:

if(theType.Equals(typeof(ClassA))
{
Return ClassA.FindByID(the given parameter);
}

但是,视觉工作室告诉我“无法将类型'ClassA'转换为'T'。我试过演员像 return (ClassA)blah blah blah; 但是视觉工作室不断告诉我这个错误。

恐怕我会反过来做这件事,我想这本来可以简单得多。那么,如何返回所需的类型?

感谢您的帮助。

PS .:对任何错误表示抱歉。我不是英语母语人士,这是我第一次使用StackOverflow:)

我尝试将其明确地投射为:

return (ClassA) ClassA.FindById(Id);

但是我得到了上面提到的相同错误消息。

这是我的完整方法。

public T GetById<T>(int Id)
{
   Type elementType = typeof(T);

   if(elementType.Equals(typeof(ClassA))
   {
      return ClassA.FindById(Id);
   }

   if(elementType.Equals(typeof(ClassB))
   {
      return ClassB.FindById(Id);
   }

   if(elementType.Equals(typeof(ClassC))
   {
      return ClassC.FindById(Id);
   }
}

2 个答案:

答案 0 :(得分:0)

好的。因此,我发现需要创建一个接口,然后在ClassA和ClassB中实现它。这样,我就删除了问题中提到的错误。 我的代码现在看起来像这样:

public ClassA : IEntity

public ClassB: IEntity

public ClassC: IEntity
public IEntity FindById<T>(int ID)
{
   Type elementType = typeof(T);

   if(elementType.Equals(typeof(ClassA))
   {
      return ClassA.FindById(ID);
   }

   if(elementType.Equals(typeof(ClassB))
   {
      return ClassB.FindById(ID);
   }

   if(elementType.Equals(typeof(ClassC))
   {
      return ClassC.FindById(ID);
   }
}

答案 1 :(得分:0)

这看起来像是接口实现问题,而不是泛型类型问题。考虑一下,如果您有一个接口IEntity,则应指定它必须具有一个函数“ IEntity FindById(int Id)”。然后,您将在ClassA,ClassB和ClassC中实现该功能(看上去已经有了)。

我不知道您在哪里实现了FindById (int id),但在我看来,您需要做的就是在界面中包含该方法:

public interface IEntity
{
    IEntity FindById(int Id);
}

public class ClassA : IEntity
{
    IEntity IEntity.FindById(int Id)
    {
        IEntity returnvalue = null;

        //do some specific stuff to get the entity
        return returnvalue;
    }
}

public class ClassB : IEntity
{
    IEntity IEntity.FindById(int Id)
    {
        IEntity returnvalue = null;

        //do some specific stuff to get the entity
        return returnvalue;
    }
}

public class ClassC : IEntity
{
    IEntity IEntity.FindById(int Id)
    {
        IEntity returnvalue = null;

        //do some specific stuff to get the entity
        return returnvalue;
    }
}

public static class TestClass
{
    public static void Test()
    {
        IEntity EA = new ClassA();
        IEntity EB = new ClassB();
        IEntity EC = new ClassC();

        EA.FindById(1);
        EB.FindById(2);
        EB.FindById(3);
    }
}

以这种方式,您实际上不会键入检查任何内容。