我试图通过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, ...
。