Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取Roslyn程序集中匿名类型的泛型参数类型_C#_Generics_Anonymous Types_Roslyn - Fatal编程技术网

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
。为什么

您看到区别了吗?在第一种情况下,您有一个构造类型(例如,
列表
)。但是当您查看程序集时,您将只看到泛型类型定义(例如,
列表
)。只有当您实际使用一些泛型参数来建立泛型类型定义时,才会创建构造类型


如果你想知道为什么所有的匿名类型都是泛型的,请阅读

也许这是因为它们是动态类型的,编译器无法间接推断它们的类型?嗯,好的,我现在明白了:)谢谢你的回答和链接参考。