Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic 猴子补片#_Dynamic_C# 4.0_Metaprogramming - Fatal编程技术网

Dynamic 猴子补片#

Dynamic 猴子补片#,dynamic,c#-4.0,metaprogramming,Dynamic,C# 4.0,Metaprogramming,是否可以在运行时扩展或修改C#类的代码 我的问题特别围绕猴子补丁/鸭子打孔或元对象编程(MOP),就像在Groovy、Ruby等脚本语言中发生的那样 是否可以在运行时扩展或修改C#类的代码 不,在.NET中不可能这样做。您可以编写派生类和重写方法(如果它们是虚拟的),但不能修改现有类。想象一下,如果您所问的是可能的:您可以修改一些现有系统类的行为,比如system.String 您还可以查看如何向现有类添加功能。您可以添加功能,但不能更改或删除功能。您可以通过添加额外方法来扩展类,但不能覆盖它们

是否可以在运行时扩展或修改C#类的代码

我的问题特别围绕猴子补丁/鸭子打孔或元对象编程(MOP),就像在Groovy、Ruby等脚本语言中发生的那样

是否可以在运行时扩展或修改C#类的代码

不,在.NET中不可能这样做。您可以编写派生类和重写方法(如果它们是虚拟的),但不能修改现有类。想象一下,如果您所问的是可能的:您可以修改一些现有系统类的行为,比如system.String


您还可以查看如何向现有类添加功能。

您可以添加功能,但不能更改或删除功能。

您可以通过添加额外方法来扩展类,但不能覆盖它们,因为添加的方法的优先级始终低于现有方法


有关更多信息,请查看《C#编程指南》。

对于目前仍在这个问题上结结巴巴的人,确实有一个称为“相对直接”的库,它可以在运行时启用这种猴子补丁。它的重点是视频游戏的修改(特别是用Unity构建的游戏),但是在这个用例之外,并没有什么能阻止人们使用它

如果您有一个这样的现有类,请从其复制示例:

public类SomeGameClass
{
公共图书馆正在运行;
公共int计数器;
私人内部剂量测量法()
{
如果(正在运行)
{
计数器++;
}
返回计数器*10;
}
}
然后Harmony可以这样修补它:

使用HarmonyLib;
使用游戏介绍;
公共类MyPatcher
{
//确保在开始时由以下两种方法调用DoPatching()
//mod加载器或喷油器
公共静态void DoPatching()
{
var harmony=new harmony(“com.example.patch”);
harmony.PatchAll();
}
}
[HarmonyPatch(类型(SomeGameClass))]
[HarmonyPatch(“DoSomething”)]
第01类
{
静态AccessTools.FieldRef isRunningRef=
AccessTools.FieldRefAccess(“isRunning”);
静态布尔前缀(SomeGameClass\uuuu实例,ref int\uuuuu计数器)
{
isRunningRef(_实例)=true;
如果(计数器>100)
返回false;
___计数器=0;
返回true;
}
静态无效后缀(参考整数结果)
{
__结果*=2;
}
}
在这里,我们有一个“前缀”补丁,它在原始方法运行之前插入,允许我们在方法内设置变量,在方法的类上设置字段,甚至完全跳过原始方法。我们还有一个“后缀”补丁,它在原始方法运行后插入,可以处理返回值之类的事情


显然,这并不像你在Ruby中所能做的那样好,根据你的用例,可能会有一些问题阻碍它的实用性,但是在那些你确实需要改变方法的情况下,Harmony是一种行之有效的方法。

我想这正是humblecoder想要的。e、 g.向字符串类型添加一个方法,以从字符串表示形式解析自定义类型,这样您就可以执行
var serialObject=“STB-2”。ToMySerial()
@Gishu,是的,我们可以使用扩展方法向现有类添加方法,但无法修改现有方法。。正确的。扩展方法可以满足某些需要。。然而,正如您所回答的那样,在Ruby中打开一个类仍然是不可能的——这就是OP所追求的。“想象一下会发生什么”——无需想象。Python允许这样做,尽管它总是一个后门,在必要时没有人会真正高兴,但它是一个非常强大的工具,可以解决现实世界中的问题。有些东西不应该被允许,因为它有可能被误用,这不是设计语言的方法。Monkey patching允许你模拟云应用和资源等服务,这样你就可以对代码运行有意义的单元测试,而不必在生产代码中添加特殊情况。而且,这只是一个例子,说明猴子补丁是多么强大,是一件好事。查看模拟大量AWS服务的
moto
Python包,这样你就可以测试你的可交付代码,而不必使用单元测试工具和乱七八糟的东西来污染它。不过,你可以通过IronRuby(或兄弟姐妹)的途径在C中获得动态特性,我知道这个问题由来已久。但确实应该有一个链接,因为我假设这些语言中的人猴补丁正在测试的部分原因。MOQ也值得一看。你可以用一些AOP框架来实现。我正在积极研究其中一个:你可以在这篇文章中查看一个样本:这是怎么可能的?需要一个说明吗?扩展方法允许您向对象添加方法(这就是LINQ函数端的实现方式)。提供的链接栏包含您需要的所有信息。扩展方法只允许在编译时添加功能,而不允许在运行时添加功能。如果要在运行时添加功能,则需要使用从DynamicObjectGood catch派生的对象。不知怎的,我正好跳过了“运行时”部分。