【发布时间】: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