Исправление обезьян C # - возможно ли это? - PullRequest
3 голосов
/ 18 мая 2010

Можно ли написать сборку 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 ]

1 голос
/ 21 мая 2010

Возможно получить доступ к методам расширения из IronPython. Смотри http://blogs.msdn.com/saveenr/archive/2008/11/14/consuming-extension-methods-in-ironpython.aspx

1 голос
/ 19 мая 2010

Это можно сделать с помощью таких структур, как TypeMock , которые подключаются к API профилирования инфраструктуры.

Однако этот вид внедрения обычно используется только для облегчения модульного тестирования, а не внутри рабочего кода, и приводит к снижению производительности. Мое мнение таково: если вам приходится делать что-то столь же радикальное, как это вне модульного тестирования, то вы, вероятно, делаете что-то не так.

0 голосов
/ 18 мая 2010

Я не верю, что возможно расширить существующий тип .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 когда-либо разрешит доступ к базовому хранилищу байтов (если не CPython), так как это небезопасно.

0 голосов
/ 18 мая 2010

вы можете использовать отражение, чтобы получить этот метод в другую сборку

Я не знаю о IronPython, но я думаю, что это поможет вам

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

...