vinesh Lacman Ответов: 2

Не удалось получить значение универсального типа T C#


Не удалось получить значение универсального типа T

public class TableManagerOf<T> where T : IComparable
   {
       void test()
       {
           var obj = typeof(T);
           m_Properties = typeof(T).GetProperties();
           foreach (var item in m_Properties)
           {
               var value = item.GetValue(obj);
           }
       }
   }


Что я уже пробовал:

Я много пытался понять, как работает универсальный тип в c#

2 Ответов

Рейтинг:
1

Jon McKee

Интерфейс icomparable[^] не имеет никаких свойств. У него есть только один метод.

Что касается вашего другого вопроса, то дженерики довольно просты по сравнению с их двоюродными братьями-шаблонами. В основном создается класс, который может принимать любой класс, соответствующий вашим ограничениям. В вашем случае любой класс, реализующий IComparable может быть использован для T Все, что вы когда-либо могли бы пожелать, и даже больше, доступно в Дженерики (Руководство По Программированию На C# )[^] на MSDN.

Еще одна тесно связанная с этим тема Ковариантность и контравариантность[^].


Рейтинг:
0

E.F. Nijboer

T - это тип, и в вашем случае T должен быть определенным классом или структурой, реализующей IComparable. Но важно помнить, что T просто определяет требование во время написания кода, то есть речь идет о классе, а не об экземпляре объекта.
Вызов GetProperties () работает нормально, но у вас нет экземпляра. Итак, какими бы свойствами ни обладал T, от какого объекта вы ожидали бы значений? Для этого вам нужен экземпляр. В своем коде вы назначаете typeof (T) объекту obj, но typeof (T) дает вам тип, а не экземпляр T. GetProperties в следующей строке-это метод типа, а не T. Если вы хотите, чтобы ваш тестовый код работал с экземпляром T, попробуйте выполнить следующее:

public class TableManagerOf<T> where T : IComparable, new()
    {
        void test()
        {
            var obj = new T();
            m_Properties = typeof(T).GetProperties();
            foreach (var item in m_Properties)
            {
                var value = item.GetValue(obj);
            }
        }
    }


Дополнительная функция new () заключается в том, чтобы убедиться, что T является классом с конструктором по умолчанию, поэтому новый экземпляр может быть создан с помощью непараметрического конструктора new T ().

Удачи вам!