Как использовать OpCodes.Call для генерации этого кода - PullRequest
0 голосов
/ 02 февраля 2012

Этот вопрос относится к: Приведение элементов коллекции с генерацией кода

Так как предыдущий вопрос не был достаточно ясен, вот что мне нужно, чтобы помочь с точно.

Как использовать OpCodes.Call для генерации этого кода:

return Enumerable.ToList<Potato>(Eumerable.Cast<Potato>(_proxyPotatoes));

Вот пример того, что я пытаюсь сделать:

public class Potato
{
}

public class ProxyPotato : Potato
{    
}

public class Stew
{
  private ICollection<ProxyPotato> _proxyPotatoes;

  //This is the code I would like to generate (specialy the cast part)
  public ICollection<Potato> Potatoes { get { return _proxyPotatoes.Cast<Potato>().ToList(); } }
}

Редактировать 1

После предложения @zmbq вот две строки IL, которые мне нужно сгенерировать:

call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::Cast<class Maxime.Potato>(class [mscorlib]System.Collections.IEnumerable)

call class [mscorlib]System.Collections.Generic.List`1<!!0> [System.Core]System.Linq.Enumerable::ToList<class Maxime.Potato>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

У меня есть предложение - напишите код на C #, скомпилируйте его и используйте ILDASM, чтобы точно узнать, что вам нужно для Emit.

2 голосов
/ 02 февраля 2012

Два вызова метода должны выглядеть примерно так:

ilg.Emit(OpCodes.Call, typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(typeof(Potato)));
ilg.Emit(OpCodes.Call, typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(typeof(Potato)));
...