如何使用 OpCodes.Call 生成此代码

发布于 2025-01-01 16:35:36 字数 1201 浏览 0 评论 0原文

此问题与以下内容相关:使用代码生成来转换集合的项目

由于上一个问题不够清楚,这就是我需要帮助的地方。

如何使用 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>)

This question is related to: Casting items of a collection with code generation

Since the previous question was not clear enough, here is what I need help with precisely.

How to use OpCodes.Call to generate this code:

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

Here is an example of what I'm trying to do:

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(); } }
}

Edit 1

After the suggestion of @zmbq here is the two line of IL i need to generate:

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>)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

來不及說愛妳 2025-01-08 16:35:36

我有一个建议 - 用 C# 编写代码,编译它并使用 ILDASM 来准确查看您需要发出的内容。

I have a suggestion - write the code in C#, compile it and use ILDASM to see exactly what you need to Emit.

暮年 2025-01-08 16:35:36

这两个方法调用应该类似于:

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

The two method calls should look something like:

ilg.Emit(OpCodes.Call, typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(typeof(Potato)));
ilg.Emit(OpCodes.Call, typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(typeof(Potato)));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文