nic*_*dev 3 c# generics anonymous-types roslyn
假设您有下一个代码:
var house = new {Color = "White", Area = 150};
var typeHouse = house.GetType();
var argumentTypes = typeHouse.GetGenericArguments();
Run Code Online (Sandbox Code Playgroud)
该argumentTypes阵列有两种类型:字符串和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
Run Code Online (Sandbox Code Playgroud)
然后argumentTypes数组显示两个泛型类型,如"Color j_ TPar"和"Area j _TPar"...... :(
我的问题是:为什么在Roslyn示例中我无法从Anonymous类型中获取正确的参数类型?
如何获得"正确"的参数类型?
如果我像你一样问同样的问题,我认为会更清楚,但是使用的是List<T>
代替异常类型:
如果我这样做
new List<int>().GetType().GetGenericArguments()
,我int
就像我期望的那样.但是,如果我查看List
mscorlib 中的类型,它会显示泛型类型T
,而不是int
.为什么?
你看得到差别吗?在第一种情况下,您有一个构造类型(例如List<int>
).但是当您查看程序集时,您将只看到泛型类型定义(例如List<T>
).仅当您使用某些通用参数实例化通用类型定义时,才会创建构造的类型.
如果你有兴趣知道为什么所有的异常类型都是通用的,请阅读Eric Lippert的文章为什么匿名类型是通用的?
归档时间: |
|
查看次数: |
1280 次 |
最近记录: |