我正在努力在从同一个抽象类(其中一些之间有另一个抽象类)继承的一堆(如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:我发现非常接近的另一件事是“类视图”窗口。有一个选项可以显示继承的成员,并给我一个平面列表。如果有一种方法可以导出它,并以某种方式显示每个属性的数据类型,那么我将全部准备就绪。
我还使用尚未准备好编译的代码,并且不会再使用一会儿了(这是全新的代码)。对于确实可以编译的代码,有一些好的建议,但是很遗憾,我还没有准备好实现这些建议。
答案 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的结果: