Nano Hash - криптовалюты, майнинг, программирование

Рекурсивная функция универсального типа

Я пытаюсь написать рекурсивную функцию-функцию, которая принимает класс в качестве аргумента и проверяет все его члены, чтобы убедиться, что все члены относятся к типу поля или вложенному типу. функция должна вызывать себя для принятия в качестве аргумента членов вложенного типа. Вот где я терплю неудачу:

    private void Validate<C>() where C : class
    {
        MemberInfo[] x = typeof(C).GetMembers();
        for (int i = 0; i < x.Length; i++)
        {
            if (x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType)
            {
                throw new Exception(string.Format("Class members must be of type Field or NestedType"));
            }
//here I have problem sending 'a' as argument to the validate function 
      x.Where(a => a.MemberType == MemberTypes.NestedType).ToList().ForEach(a => Validate<typeof(a)>());
        }
    } 

  • Вам нужно использовать отражение. 16.02.2016
  • @SLaks, не могли бы вы показать мне, как? 16.02.2016
  • Незначительная, не связанная с этим ошибка: условие должно содержать &&, а не ||; в противном случае он всегда будет тривиально удовлетворен: x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType. 17.02.2016

Ответы:


1

Более простым решением было бы определить перегрузку частного метода, которая принимает параметр Type:

private void Validate<C>() where C : class
{
    Validate(typeof(C));
} 

private void Validate(Type type)
{
    MemberInfo[] x = type.GetMembers();
    for (int i = 0; i < x.Length; i++)
    {
        if (x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType)
        {
            throw new Exception(string.Format("Class members must be of type Field or NestedType"));
        }

        foreach (var n in x.GetNestedTypes())
            Validate(n);
    }
}
16.02.2016
  • Greaaaaat, большое спасибо. кстати должно быть n.GetType();) 16.02.2016
  • @AshkanMobayenKhiabani: Вы правильно заметили, что я ошибочно передавал MemberInfo Validate. Однако я не думаю, что вызов MemberInfo.GetType является правильным, поскольку он возвращает информацию о типе для RuntimeType. Я бы предложил использовать _5 _ вместо этого, как показано в обновленном коде. 17.02.2016

  • 2

    Вам нужно использовать Reflection, чтобы вызвать метод с правильным параметром типа:

    typeof(YourClass)
        .GetMethod(nameof(Validate))
        .MakeGenericMethod(a.GetType())
        .Validate()
    
    16.02.2016
  • ну, в этом случае, что я должен заменить YourClass в моем кое? это моя проблема 16.02.2016
  • Класс, содержащий ваш метод. 16.02.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..