2012-02-01 3 views
0

Этот вопрос связан с: Casting items of a collection with code generationКак использовать OpCodes.Call генерировать этот код

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

Как использовать 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

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

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

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

+0

Я думаю, это большой совет. – usr

+0

Это действительно хороший совет, но я до сих пор не знаю, как генерировать код IL, который я вижу (я добавил две строки, которые, как мне кажется, мне нужно создать как Edit 1) – W3Max