为什么我的一些类名使用新的VS 2015编译器以“<> c”形式返回?

时间:2015-07-02 13:53:26

标签: c# .net visual-studio-2015 roslyn vs-2015-preview

我们有一堆EF Migration类在我们的集成测试中执行。对于某些测试,我们使用反射找到迁移类:

var dbMigrationClasses = migrationsAssembly.GetTypes()
                         .Where(t => t.IsSubclassOf(typeof(DbMigration)));

然后我们在某些测试中使用.Name属性:

var migrationsWithInvalidClassNames = migrationClasses
                                      .Where(mt => !IsValidMigrationClassName(mt.Name));

但是,自升级到VS 2015 RC以来,我们的许多课程都将其名称报告为“<> c”,而FullName也以此结尾:

Name = "<>c"
FullName = "DataMigrations.Migrations._20150121090200_DoSomeStuff+<>c"

这种情况从未发生过(我猜它是导致它的VS 2015s新编译器),它只发生在我们迁移类的一些(可能是四分之一)。所有类看起来都是相同的(所有内部,相同的方法/属性)。

我可以通过阅读FullName并将其剥离来解决这个问题,但我很想知道发生了什么以及为什么它只会影响某些类。这是两个示例类,一个是精细的,一个是<>c。我删除的只是其中的SQL:

// File 1
namespace NewMind.DMS.DataMigrations.Migrations
{
    [MigrationName("Drop the SavedSearchJSON column from the SavedSearch table.")]
    internal class _20150121143400_DropTheSavedSearchJSONColumnFromTheSavedSearchTable : DmsMigration
    {
        public override void Up()
        {
            Sql(@"(SNIP)");
        }
    }
}

// File 2
namespace NewMind.DMS.DataMigrations.Migrations
{
    [MigrationName("Update Facility Key data type as it was incorrectly smallint in some databases.")]
    internal class _20150424130800_StandardiseFacilityKeyDataType : DmsMigration
    {
        public override void Up()
        {
            Sql(@"(SNIP)");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您不需要使用FullName - _20150121090200_DoSomeStuff部分只是“父”类。 <>c嵌套在_20150121090200_DoSomeStuff中。因此,要获取嵌套类及其父级的名称,您只需执行此操作:

public static string GetAnonymousName(this Type type)
{
  if (!type.IsNested) return type.Name;

  return type.DeclaringType.GetAnonymousName() + "+" + type.Name;
}

我认为它在VS2015中没有改变。也许你正在使用更新版本的Entity Framework或类似的东西?

答案 1 :(得分:0)

好的,这是用户错误:

我实际上错过了代码中的一个重要行...我们以两种方式找到迁移类...基类和命名空间:

// Get all possible migration classes (use base class + namespace)
var dbMigrationClasses = migrationsAssembly.GetTypes().Where(t => t.IsSubclassOf(typeof(DbMigration)));
var migrationNamespaceClasses = migrationsAssembly.GetTypes().Where(t => t.Namespace != null && t.Namespace.EndsWith(".Migrations", StringComparison.OrdinalIgnoreCase));

// Join them together for tests to query
migrationClasses = dbMigrationClasses.Union(migrationNamespaceClasses);

这意味着除了实际的类之外,我们还从新的编译器中获取编译器生成的类。

为什么我没有看到文件有任何区别?我误读了类名,并选择了旁边的类似迁移。猜猜正确的是什么?...

AddColumn("SavedSearch", "SavedSearchXML", c => c.String(nullable: false, defaultValue: "", isMaxLength: true));

卫生署。