методы расширения и недавно выпущенные расширенные сборки - PullRequest
2 голосов
/ 21 сентября 2011

как оцениваются методы расширения?или в очень конкретном случае использования: если метод расширения реализован как метод экземпляра класса новой версией сборки и эта сборка обновлена, а зависимые сборки нет, будут ли они:

  1. по-прежнемуполучить доступ к методу расширения
  2. получить доступ к новому методу экземпляра класса
  3. throw

Я добавил следующие простые примеры кода сборки FooExtensions, сборки IFoo,сборка FooBefore и сборка FooAfter, а также тестовая сборка.Идея заключается в том, что первый выпуск начинается с FooExtensions, IFoo, FooBefore и Test.Тест будет динамически загружать сборку FooBefore и зависимые сборки и создавать Foo.Затем он вызовет GetMessage и должен записать в консоль «сообщение».Для второго выпуска мы заменяем только FooBefore на FooAfter и снова запускаем тест.Тогда что происходит?

#region Assembly FooExtensions
public static class FooExtensions
{
    public static string GetMessage(this IFoo foo)
    {
        return foo.Message;
    }
}
#endregion

#region Assembly IFoo
public interface IFoo
{
    string Message { get; }
}
#endregion

#region Assembly Foo before update
namespace FooBefore
{
    public class Foo : IFoo
    {
        public string Message
        {
            get { return "message"; }
        }
    }
}
#endregion

#region Assembly Foo after update
namespace FooAfter
{
    public class Foo : IFoo
    {
        public string GetMessage() { return "bar"; }

        public string Message
        {
            get { return "message"; }
        }
    }
}
#endregion

#region Assembly Test
public class Class1
{
    public void T()
    {
        // if extension method is implemented in new version of deriving assembly and
        // just that assembly is switched but not dependent assemblies, what happens?

        // before update: extension method, as we know it
        Console.WriteLine((Activator.CreateInstance("Foo.DLL", "Foo").Unwrap() as IFoo).GetMessage());
        // after update: class instance method, but do we know?
        Console.WriteLine((Activator.CreateInstance("Foo.DLL", "Foo").Unwrap() as IFoo).GetMessage());
    }
}
#endregion

1 Ответ

2 голосов
/ 21 сентября 2011

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

...