Tag: reflection.emit

是否可以在运行时向EXISTING类添加方法? 为什么或者为什么不?

我想这可能会使用Reflection.Emit, 但是关于SO的类似问题只回答了如何动态创建类/方法,而不是如何更新现有类。 同样,是否可以在运行时删除方法/类? 如果是这样,我想可以删除该类,并使用旧方法和新方法将其添加回来。 提前致谢。 PS我没有这个用途,只是好奇心问题。

生成动态方法以设置结构的字段而不是使用reflection

假设我有以下代码使用reflection更新struct的字段。 由于struct实例被复制到DynamicUpdate方法中, 因此需要在传递之前将其装箱到对象 。 struct Person { public int id; } class Test { static void Main() { object person = RuntimeHelpers.GetObjectValue(new Person()); DynamicUpdate(person); Console.WriteLine(((Person)person).id); // print 10 } private static void DynamicUpdate(object o) { FieldInfo field = typeof(Person).GetField(“id”); field.SetValue(o, 10); } } 代码工作正常。 现在,假设我不想使用reflection,因为它很慢。 相反,我想生成一些直接修改id字段的CIL并将该CIL转换为可重用的委托(例如,使用动态方法function)。 特别是,我想用s / t替换上面的代码,如下所示: static void Main() { var action […]

通用FromEvent方法

使用新的async / await模型,生成一个在事件触发时完成的Task非常简单; 你只需要遵循这种模式: public class MyClass { public event Action OnCompletion; } public static Task FromEvent(MyClass obj) { TaskCompletionSource tcs = new TaskCompletionSource(); obj.OnCompletion += () => { tcs.SetResult(null); }; return tcs.Task; } 这允许: await FromEvent(new MyClass()); 问题是您需要为每个要await类中的每个事件创建一个新的FromEvent方法。 这可能会变得非常快,而且它主要只是样板代码。 理想情况下,我希望能够做到这样的事情: await FromEvent(new MyClass().OnCompletion); 然后我可以为任何实例上的任何事件重用相同的FromEvent方法。 我花了一些时间来尝试创建这样的方法,并且存在许多障碍。 对于上面的代码,它将生成以下错误: 事件’Namespace.MyClass.OnCompletion’只能出现在+ =或 – =的左侧 据我所知,没有办法通过代码传递这样的事件。 所以,下一个最好的事情似乎是尝试将事件名称作为字符串传递: await FromEvent(new […]