C# 获取Roslyn程序集中匿名类型的泛型参数类型
假设您有下一个代码:C# 获取Roslyn程序集中匿名类型的泛型参数类型,c#,generics,anonymous-types,roslyn,C#,Generics,Anonymous Types,Roslyn,假设您有下一个代码: var house = new {Color = "White", Area = 150}; var typeHouse = house.GetType(); var argumentTypes = typeHouse.GetGenericArguments(); argumentTypes数组有两种类型:string和int。。。没关系:) 但是如果我有下一个使用Roslyn编译器的代码: var
var house = new {Color = "White", Area = 150};
var typeHouse = house.GetType();
var argumentTypes = typeHouse.GetGenericArguments();
argumentTypes数组有两种类型:string和int。。。没关系:)
但是如果我有下一个使用Roslyn编译器的代码:
var tree = SyntaxTree.ParseText(@"
namespace TestRoslyn {
public class MyClass {
public void GetHouse(){
var house = new {Color = 'W', Area = 150};
}
}
}");
byte[] assembly;
var compiler = Compilation.Create("Test", new CompilationOptions(outputKind: OutputKind.DynamicallyLinkedLibrary,
usings: new[] { "System" }))
.AddSyntaxTrees(tree)
.AddReferences(new MetadataFileReference(typeof(object).Assembly.Location));
using (var stream = new MemoryStream())
{
var result = compiler.Emit(stream);
if (!result.Success)
throw new Exception("You have an error! :( ");
assembly = stream.ToArray();
}
Type[] types = Assembly.Load(assembly).GetTypes();
var argumentTypes = types[0].GetGenericArguments(); //types [0] returns the <>f__AnonymousType
var-tree=SyntaxTree.ParseText(@)
名称空间TestRoslyn{
公共类MyClass{
公共屋({
var house=新{颜色='W',面积=150};
}
}
}");
字节[]汇编;
var compiler=Compilation.Create(“Test”),新编译选项(outputKind:outputKind.DynamicallyLinkedLibrary,
使用:新[]{“系统”})
.AddSyntaxTrees(树)
.AddReferences(新的MetadataFileReference(typeof(object).Assembly.Location));
使用(var stream=new MemoryStream())
{
var result=compiler.Emit(流);
如果(!result.Success)
抛出新异常(“您有一个错误!:(”);
assembly=stream.ToArray();
}
Type[]types=Assembly.Load(Assembly.GetTypes();
var argumentTypes=types[0]。GetGenericArguments();//types[0]返回f__匿名类型
然后argumentTypes数组显示两种通用类型,如“Color j_TPar”和“Area j_TPar”
我的问题是:为什么在Roslyn示例中,我不能从匿名类型中获得正确的参数类型
如何获得“正确”的参数类型?我想如果我问的问题与你问的问题相同,但使用了
List
而不是匿名类型,会更清楚:
如果我做了new List().GetType().GetGenericArguments()
,我得到的是int
,正如我预期的那样。但是如果我查看mscorlib中的List
类型,它显示的是泛型T
,而不是int
。为什么
您看到区别了吗?在第一种情况下,您有一个构造类型(例如,列表
)。但是当您查看程序集时,您将只看到泛型类型定义(例如,列表
)。只有当您实际使用一些泛型参数来建立泛型类型定义时,才会创建构造类型
如果你想知道为什么所有的匿名类型都是泛型的,请阅读也许这是因为它们是动态类型的,编译器无法间接推断它们的类型?嗯,好的,我现在明白了:)谢谢你的回答和链接参考。