как оцениваются методы расширения?или в очень конкретном случае использования: если метод расширения реализован как метод экземпляра класса новой версией сборки и эта сборка обновлена, а зависимые сборки нет, будут ли они:
- по-прежнемуполучить доступ к методу расширения
- получить доступ к новому методу экземпляра класса
- 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