我的作业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);
}
}
答案 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
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);
}
}
以这种方式,您实际上不会键入检查任何内容。