C#monkey修补 - 有可能吗?

时间:2010-05-17 23:34:13

标签: c# ironpython dynamic-language-runtime monkeypatching

是否可以编写一个C#程序集,在加载时会将方法从另一个程序集注入一个类?如果是,注入的方法是否可以使用DLR的语言获得,如IronPython?

namespace IronPython.Runtime
{
    public class Bytes : IList<byte>, ICodeFormattable, IExpressionSerializable
    {
        internal byte[] _bytes;

        //I WANT TO INJECT THIS METHOD
        public byte[] getbytes()
        {
            return _bytes;
        }
    }
}

我需要这种方法,如果可能的话,我想避免重新编译IronPython。

4 个答案:

答案 0 :(得分:1)

这可以通过TypeMock这样的框架来完成,这些框架可以挂钩到框架分析API中。

然而,这种注入通常仅用于促进单元测试,而不是用于生产代码,并且性能受到影响。我的意见是,如果你不得不做一些像单元测试那样激烈的事情,那么你可能做错了。

答案 1 :(得分:1)

答案 2 :(得分:0)

您可以使用反射将此方法转换为另一个程序集

我不知道IronPython,但我认为这会对你有帮助

http://www.voidspace.org.uk/ironpython/dynamically_compiling.shtml

答案 3 :(得分:0)

我不相信一旦创建了.NET类型就可以扩展它。

如果您只需要byte[](在IronPython中,我推测),您可以这样做:

>>> import clr
>>> import System
>>> b = bytes([1, 2, 3, 4])
>>> a = System.Array[bytes](b)
>>> a
Array[bytes]((b'\x01', b'\x02', b'\x03', b'\x04'))

但是,IronPython不太可能允许访问Bytes的底层存储(除非是CPython),因为它不安全。