【问题标题】:Get Generic arguments type of anonymous type in Roslyn assembly在 Roslyn 程序集中获取匿名类型的通用参数类型
【发布时间】:2013-09-25 16:28:23
【问题描述】:

假设你有下一个代码:

        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 

然后 argumentTypes 数组显示了两个泛型类型,如“Color j_TPar”和“Area j_TPar”... :(

我的问题是:为什么在 Roslyn 示例中我无法从 Anonymous 类型中获得正确的参数类型?

如何获得“正确”的参数类型?

【问题讨论】:

  • 也许这是因为它们是动态类型的,编译器无法间接推断它们的类型?

标签: c# generics anonymous-types roslyn


【解决方案1】:

我想如果我问和你一样的问题会更清楚,但使用List&lt;T&gt;而不是异常类型:

如果我做new List&lt;int&gt;().GetType().GetGenericArguments(),我会得到int,正如我所料。但是如果我查看 mscorlib 中的 List 类型,它会显示泛型类型 T,而不是 int。为什么?

你看出区别了吗?在第一种情况下,您有一个构造类型(例如List&lt;int&gt;)。但是当您查看程序集时,您只会看到泛型类型定义(例如List&lt;T&gt;)。只有当您使用一些泛型参数实际实例化泛型类型定义时,才会创建构造类型。

如果您有兴趣了解为什么所有异常类型都是通用的,请阅读Eric Lippert's article Why are anonymous types generic?

【讨论】:

  • 嗯好的,我现在明白了:)感谢您的回答和链接参考。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多