【发布时间】:2017-06-16 16:34:30
【问题描述】:
我需要动态更改一个特定的属性并且一直在使用这个snipplet:
var _oldMethod = typeof(TypeName).GetProperty("OldProperty", BindingFlags.Public | BindingFlags.Static).GetMethod;
var _newMethod = typeof(OwnTypeName).GetProperty("NewProperty", BindingFlags.Public | BindingFlags.Static).GetMethod;
ReplaceMethod(_oldMethod, _newMethod);
...
private static unsafe void ReplaceMethod(MethodInfo _oldMethod, MethodInfo _newMethod)
{
var _oldMethodAddress = new IntPtr((int*)_oldMethod.MethodHandle.Value.ToPointer() + 2);
var _destination = (uint*)_oldMethodAddress.ToPointer();
*destination = (uint)_newMethod.MethodHandle.GetFunctionPointer().ToInt32();
}
不幸的是,这需要通过重新创建原始属性进行一些反编译。我现在正在寻找的是一种复制和备份原始方法并用新方法动态替换旧方法或恢复原始方法的可能性。
有人知道如何实现吗?
编辑: 我可能应该进一步澄清我的情况:
public static class ClassName
{
public static bool Property
{
get
{
// Conditions
}
}
}
我无法访问ClassName,需要在特定情况下强制Property为false,在其他情况下需要将其替换为原始返回值。我一直在使用上面提到的 ReplaceMethod,但不想从头开始反编译和重建属性(而不是原始属性的某种备份)
【问题讨论】:
-
你能告诉我们你为什么要这样做的背景吗?
-
仅供参考,在 64 位机器上,IntPtr 不适合
uint。 -
添加了更多信息
-
Funny 会问你是否可以访问
ClassName,因为如果你这样做了,还有更好的方法。我认为您还需要其他无法访问的课程也可以从您的黑客中受益吗?如果没有,您可以使用垫片。
标签: c# methods reflection replace