var pointType = typeof(Point<>).MakeGenericType(type);
复制代码
上面的代码在 NativeAOT 下不会工作,因为编译器无法推断出 Point 的实例化,所以编译器既不会生成 Point 的代码,也不会生成 Point 的代码。
尽管编译器可以为 int,float,甚至泛型类型定义 Point 生成代码,但是如果编译器没有生成 Point 的实例化代码,你就无法使用 Point。
即使你使用 TrimmerRootAssembly 来告诉编译器将你的程序集中的所有东西都作为根,也仍然不会为像 Point 或 Point 这样的实例化生成代码,因为它们需要根据类型参数来单独构造。
解决方案
如果我们调用 Foo,很不幸,这在 NativeAOT 下不会工作。编译器确实看到你是用类型参数 Bar 调用 Foo 的,但在 Foo 的上下文中,编译器不知道 T 是什么,而且没有其他代码直接使用 Bar 的属性,所以编译器不会为 Bar 的属性生成代码。
这里我们可以使用 DynamicallyAccessedMembers 来告诉编译器为 T 的所有公共属性生成代码: