为什么匿名类型的AssemblyQualifiedName不总是相同的?



我试图通过AssemblyQualifiedName从程序集集合中找到匿名类型,但是尽管匿名类型存在于扫描的程序集中,但没有找到。GetTypes()似乎返回具有其他AssemblyQualifiedNames的类型。

为什么AssemblyQualifiedNames不同,我怎么做才能在给定的程序集中找到正确的类型?

[Fact]
public void AnonTypes()
{
var entity = new { SomeString = "Asger" };
var type = entity.GetType();
var assemblyQualifiedName = type.AssemblyQualifiedName;
var types = type.Assembly.GetTypes()
.Where(x => x.AssemblyQualifiedName == assemblyQualifiedName)
.ToList();
types.Count.ShouldBe(1);
}

请注意type . gettype (assemblyQualifiedName)找到类型,但我不能使用这个方法,因为我并不总是有assemblyQualifiedName,而是一些其他的限定符来搜索。

还要注意,如果entity是ValueTuple,也会发生同样的事情。

问题是像

这样的代码
var x = new { SomeString = "" };

创建一个类似

的类型
public class AnonymousType0<T> 
{
public T SomeString { get; set; }
}

因此,x.GetType().AssemblyQualifiedName返回包含泛型类型信息的类型名称。要使其工作,您需要调用GetGenericTypeDefinition()来摆脱泛型类型信息。

例如,List<int>类型将具有像System.Collections.Generic.List``1[[System.Int32, ...]], ...一样的AssemblyQualifiedName,但在assembly.GetTypes()中,您将找到System.Collections.Generic.List``1, ...

相关内容

  • 没有找到相关文章

最新更新