C# 为什么匿名类型的AssemblyQualifiedName不总是相同的?
我试图通过AssemblyQualifiedName从程序集集合中查找匿名类型,但尽管该匿名类型存在于扫描的程序集中,但找不到。GetTypes()似乎返回带有其他AssemblyQualifiedNames的类型 为什么AssemblyQualifiedNames不同,如何在给定的程序集中找到正确的类型C# 为什么匿名类型的AssemblyQualifiedName不总是相同的?,c#,.net,reflection,system.reflection,C#,.net,Reflection,System.reflection,我试图通过AssemblyQualifiedName从程序集集合中查找匿名类型,但尽管该匿名类型存在于扫描的程序集中,但找不到。GetTypes()似乎返回带有其他AssemblyQualifiedNames的类型 为什么AssemblyQualifiedNames不同,如何在给定的程序集中找到正确的类型 [Fact] public void AnonTypes() { var entity = new { SomeString = "Asger
[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,而是要搜索其他限定符
还请注意,如果实体是ValueTuple,也会发生同样的情况。问题在于
var x=new{SomeString=”“};
创建一个类似
public class AnonymousType0<T>
{
public T SomeString { get; set; }
}
公共类匿名类型0
{
公共T SomeString{get;set;}
}
因此x.GetType().AssemblyQualifiedName
返回包含泛型类型信息的类型的名称。
要使其工作,您需要调用GetGenericTypeDefinition()
,以摆脱泛型类型信息
例如,类型
List
的AssemblyQualifiedName类似于System.Collections.Generic.List``1[[System.Int32,…],…
,但在assembly.GetTypes()
中,您会发现System.Collections.Generic.List``1,
问题是这样的代码
var x=new{SomeString=”“};
创建一个类似
public class AnonymousType0<T>
{
public T SomeString { get; set; }
}
公共类匿名类型0
{
公共T SomeString{get;set;}
}
因此x.GetType().AssemblyQualifiedName
返回包含泛型类型信息的类型的名称。
要使其工作,您需要调用GetGenericTypeDefinition()
,以摆脱泛型类型信息
例如,类型
List
将具有AssemblyQualifiedName,如System.Collections.Generic.List``1[[System.Int32,…],…
,但在assembly.GetTypes()
中,您会找到System.Collections.Generic.List``1,
,谢谢,但是为什么这些类型是从assembly.GetTypes()返回的呢不返回相同的AssemblyQualifiedName(带有泛型类型信息)?我相信如果我使用GetGenericTypeDefinition(),我将找不到我需要的封闭泛型类型,或者我误解了您的意思?assembly.GetTypes()
返回所有已定义类型的列表。对于泛型类型,例如List
,它将包含类型List
,但不包含派生类型List
。当然可以。我误以为匿名类型的封闭形式也在程序集中定义。现在我明白了,它们显然不是,这毫无意义:)忘记标记为答案,抱歉,现在完成:)谢谢,但是为什么从assembly.GetTypes()返回的类型不返回相同的AssemblyQualifiedName(带有泛型类型信息)?我相信如果我使用GetGenericTypeDefinition(),我将找不到我需要的封闭泛型类型,或者我误解了您的意思?assembly.GetTypes()
返回所有已定义类型的列表。对于泛型类型,例如List
,它将包含类型List
,但不包含派生类型List
。当然可以。我误以为匿名类型的封闭形式也在程序集中定义。现在我明白了,他们显然不是,这是毫无意义的:)忘记标记为答案,对不起,现在完成:)