Как вернуть универсальный тип как точный тип, основанный на типе T в C # - PullRequest
0 голосов
/ 08 мая 2019

У меня возникли некоторые проблемы с моим домашним кодом 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 голосов
/ 08 мая 2019

Это похоже на проблему реализации интерфейса больше, чем проблема общего типа.Учтите, что если у вас есть интерфейс 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);
    }
}

Таким образом, вы на самом деле ничего не печатаете.

0 голосов
/ 08 мая 2019

Хорошо. Поэтому я понял, что мне нужно создать интерфейс и затем реализовать его в 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);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...