使用Xamarin的通用约束

时间:2015-08-24 14:34:41

标签: ios generics xamarin

我有以下具有泛型类型约束的泛型类型。

public class GenericType<T> where T: IFoo
{
}

然后我尝试从开放泛型类型创建一个封闭的泛型类型。

var fooGenericType = typeof(GenericType<>).MakeGenericType (typeof(IFoo));  
var intGenericType = typeof(GenericType<>).MakeGenericType (typeof(int)); 

在模拟器中运行时,尝试使用int作为预期的类型参数来创建一个封闭的泛型类型时失败。

但是,当在实际设备(iPhone)上运行时,它还将使用int创建一个封闭的泛型类型。 它似乎不尊重通用约束,但这只发生在设备上。在模拟器上,一切都如预期的那样。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这似乎与MonoTouch使用AoT编译的事实有关。它引起了有关泛型类型的一些限制,如指向here

答案 1 :(得分:0)

就像William Barbosa提到的那样,iOS上的泛型类型存在局限性。 当链接器认为它们不是必需的时,链接器会排除具有多个参数的泛型类型的组合。由于模拟器是不同的构建目标,因此链接器可能以不同的方式工作。

您可以通过在代码中的任何位置使用链接器来强制链接器包含具有特定类型参数的泛型类型。 一种常见的方法是提供LinkerPleaseInclude.cs文件,例如:https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/DailyDilbert/DailyDilbert.Touch/LinkerPleaseInclude.cs

此处也指出:MakeGenericMethod/MakeGenericType on Xamarin.iOS