使用具有代码访问安全性的C#迭代器方法的问题

Tim*_*ter 7 c# iterator typeloadexception code-access-security yield-return

我有一个简单的方法,使用迭代器块返回IEnumerable<T>:

IEnumerable<MyItem> GetItems()
{
    foreach (var item in Items)
    {
        yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,此方法工作正常,但如果我将一个[SecurityCritical]属性应用于程序集(或包含上述方法的类),它会TypeLoadException在尝试调用该方法时抛出一个.无法加载的类型是编译器生成的类,它对应于迭代器方法,它GetEnumerator是导致问题的方法,因为它是安全透明的.

为了比较,如果我修改上面的方法,使其填充并返回a List<MyItem>,一切正常.

有什么建议?

谢谢,

蒂姆.

Jon*_*nna 3

这不是最好的事情,所以希望您能找到更好的方法,但您总是可以放弃编译器生成的代码并创建您自己的实现类IEnumerator<MyItem>(也许您自己的类实现IEnumerable<MyItem>- 根据复杂性,这样做可能会让事情变得更容易或更困难),然后或多或少地像 .NET2.0 之前的日子一样构建枚举器。

如果真正的迭代器块的逻辑非常复杂,您可能会发现查看编译器为您创建的类的反射是执行此操作的一个很好的起点,尽管有时生成的代码更复杂(或者至少,可读性较差),而不是人们自己采取的方法。

IEnumerator99% 的情况下,创建一个类yield对我们来说非常好,但仍然有必要创建一个类,这总是有点令人失望,但它可能会解决您的问题。