C# Использование списка отражений только верхних классов, кроме связанных - PullRequest
1 голос
/ 09 февраля 2020

У меня есть довольно простая коллекция многих (слишком много ..) классов в указанном c пространстве имен. У них нет вложенных классов, но есть связанные. Пример (упрощенный):

namespace ConsoleApp1.Methods
{
    public class Method100Response201
    {

        public Method100Response201()
        {
            super = new Method100Response201_1();
        }

        public string aName { get; set; }
        public string R1_201 { get; set; } = "R1_201";
        public Method100Response201_1 super { get; set; }

        public void DoSpecialThing()
        {
             Console.WriteLine ("Something Blue.."); //just complimentary-no use
        }

    }

    public class Method100Response201_1
    {
        public string aName { get; set; }
        public string R1_201_1 { get; set; } = "R1_201_1";
    }

    public class Method100Response404
    {
        public void DoSpecialThing()
        {
          Console.WriteLine ("Something Old.."); 
        }

        public string R1_04 { get; set; } = "R1_04";
    }

    public class Method200Response200
    {
        public string R2_02 { get; set; } = "R2_02";
    }
}

Это то, что у меня есть (учтите, что все мои классы находятся в "ConsoleApp1.Methods"):

Type[] typelist = GetTypesInNamespace (Assembly.GetExecutingAssembly (), "ConsoleApp1.Methods");

for ( int i = 0; i < typelist.Length; i++ )
{
      Console.WriteLine ("Found Response Model: "+ typelist[i].Name);
}
Console.ReadKey();

с

private static Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return assembly.GetTypes()
                   .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
                   .ToArray();
}

Как я мог преобразовать свой код так, чтобы я получил список только верхних классов ( рассматривают как верхние классы, которые не представлены как типы свойств других классов )

Ожидаемые результаты

Method100Response201
Method100Response404
Method200Response200

, а не Method100Response201_1, поскольку используется Method100Response201

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Может быть, вы хотите что-то вроде этого

var classes = AppDomain.CurrentDomain.GetAssemblies()
                       .SelectMany(t => t.GetTypes())
                       .Where(t => 
                                 t.IsClass && 
                                 t.Namespace == "ConsoleApp1.Methods" && 
                                 !t.IsNested)
                       .ToList();

var properties = classes.SelectMany(
   x => x.GetProperties(BindingFlags.Public | BindingFlags.Instance)
         .Select(y => y.PropertyType));

var results = classes.Where(x => !properties.Contains(x))
                     .Select(x => x.Name);

foreach (var result in results)
   Console.WriteLine(result);

Учитывая ваше точное пространство имен, результаты будут

Method100Response201
Method100Response404
Method200Response200

Примечание : i сделал некоторые предположения здесь, однако настройте этот код по мере необходимости

0 голосов
/ 09 февраля 2020

Ну, если вы хотите это сделать, значит, у вас есть работа. Поместите типы в хэш-набор, L oop через все типы и получите все свойства, посмотрите типы возвращаемых свойств, удалите эти типы из набора ha sh. Ничего волшебного в этом нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...