有没有办法在我的编辑器中查看类的所有成员(至少是属性),包括其基类?

时间:2019-04-09 18:23:51

标签: c# visual-studio visual-studio-2017

我正在努力在从同一个抽象类(其中一些之间有另一个抽象类)继承的一堆(如30个)类上实现工厂模式。

我有大约50种不同的“创建”方法要编写,而要跟踪在每个Create方法中我为哪些属性编写了定义,这很累。

是否有用于VS2017的工具或插件,将输出所有可用属性的简单列表(它们的类型将是一个奖励,并且我可以导出到电子表格的东西更好),包括在派生类中声明的那些属性,它是父类,还有祖父母+类吗?这样,我可以在工厂类中编写每个“创建”方法时“检查”我定义的方法了吗?

显然,此信息可用,因为智能感知和编译器“知道”此相同信息。

右键单击类名称并检查->层次结构使我有点接近,但是我似乎无法获得树中所有成员/属性的列表,只能选择类/继承“层”。 / p>

示例(除了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许可证,因此在我的情况下可以接受使用该许可证的答案。

EDIT2:我发现非常接近的另一件事是“类视图”窗口。有一个选项可以显示继承的成员,并给我一个平面列表。如果有一种方法可以导出它,并以某种方式显示每个属性的数据类型,那么我将全部准备就绪。

我还使用尚未准备好编译的代码,并且不会再使用一会儿了(这是全新的代码)。对于确实可以编译的代码,有一些好的建议,但是很遗憾,我还没有准备好实现这些建议。

1 个答案:

答案 0 :(得分:0)

您可以使用反射轻松实现类似的效果,各列之间用制表符分隔,以便您可以粘贴到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