Есть ли способ просмотреть все члены (или, по крайней мере, свойства) класса, включая его базовый класс, в моем редакторе? - PullRequest
0 голосов
/ 09 апреля 2019

Я работаю над реализацией шаблона фабрики для нескольких (примерно 30) классов, которые наследуются от одного и того же абстрактного класса (некоторые имеют другой абстрактный класс между ними). ​​

У меня есть около 50 различных методов «Create» для написания, и утомительно пытаться отслеживать, для каких свойств я написал определение для каждого из этих методов Create.

Существует ли инструмент или плагин для VS2017, который будет выводить простой список всех доступных свойств (и их типы будут бонусом, а то, что я могу экспортировать в электронную таблицу, еще лучше), включая те, которые объявлены в производном классе , а это родительский класс, а какие-нибудь дедушка + классы? Таким образом, я могу «отметить» те, которые я определил при написании каждого из этих методов «Создать» в моем классе фабрики?

Очевидно, что эта информация доступна, поскольку intellisense и компилятор "знают" эту же информацию.

Если щелкнуть правой кнопкой мыши имя класса и проверить -> Иерархии, я немного сблизился, но мне кажется, что я не могу получить список ВСЕХ членов / свойств в дереве, только выбранный "уровень" класса / наследования.

Пример (кроме IRL эти классы находятся в отдельных файлах, так что это нелегко сделать вручную):

public abstract class Foo
{
    public string Name { get; set; }
    public string Color { get; set; }
    public int Quantity { get; set; }
}

public class Bar : Foo
{
    public double Width { get; set; }
    public double Length { get; set; }
    public double Depth { get; set; }
}

Я бы хотел затем экспортировать список, который будет выглядеть примерно так:

public string Name
public string Color
public int Quantity
public double Width
public double Length
public double Depth

Таким образом, я могу отмечать каждое свойство при его реализации.

РЕДАКТИРОВАТЬ: я должен упомянуть, что у меня есть лицензия Resharper, поэтому ответ, который использует ее, будет приемлемым в моем случае.

РЕДАКТИРОВАТЬ 2: Еще одна вещь, которую я обнаружил, которая ОЧЕНЬ близка, это окно Class View. Есть возможность показать унаследованных членов и получить мне плоский список. Если бы был способ экспортировать это и как-то показать тип данных для каждого свойства, я был бы готов.

Также я работаю с кодом, который не готов к компиляции, и не буду некоторое время (это весь новый код). Было несколько хороших предложений для кода, который компилируется, но, к сожалению, я не готов их реализовать.

1 Ответ

0 голосов
/ 09 апреля 2019

Вы можете легко добиться чего-то подобного с помощью Reflection, столбцы которых разделены табуляцией, чтобы можно было просто вставить их в Excel.

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        var assembly = typeof(Foo).Assembly;

        var types = assembly.ExportedTypes
            // Abrstract && Sealed = Static classes
            .Where(x => x.IsClass && !(x.IsAbstract && x.IsSealed));

        var builder = new StringBuilder("Class\tDeclared By\tMember type\tName\n");

        foreach (var type in types)
        {
            builder.AppendLine(GetTypeInformation(type));
        }

        // result is copied into the clipboard, just CTRL+V into Excel
        System.Windows.Forms.Clipboard.SetText(builder.ToString());
    }

    private static string GetTypeInformation(Type type)
    {
        var classInformationBuilder = new StringBuilder();

        foreach (var member in type.GetProperties())
        {
            classInformationBuilder.AppendLine($"{type.Name}\t{member.DeclaringType.Name}\t{member.PropertyType.Name}\t{member.Name}");
        }

        return classInformationBuilder.ToString();
    }
}

public abstract class Foo
{
    public string Name { get; set; }
    public string Color { get; set; }
    public int Quantity { get; set; }
}

public class Bar : Foo
{
    public double Width { get; set; }
    public double Length { get; set; }
    public double Depth { get; set; }
}

Результаты в Excel:

enter image description here

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