如何评估扩展方法?或者在一个非常具体的用例中:如果扩展方法是通过新版本的程序集实现为类实例方法并且该程序集已更新但依赖程序集不是,则它们是否会:
我添加了以下FooExtensions程序集,IFoo程序集,FooBefore程序集和FooAfter程序集以及Test程序集的简单代码示例。这个想法是第一个版本开始于FooExtensions,IFoo,FooBefore和Test。该测试将动态加载程序集FooBefore和依赖程序集并创建一个Foo。然后它将调用GetMessage并应写入控制台“message”。对于第二个版本,我们只用FooAfter替换FooBefore并再次运行测试。然后会发生什么?
#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
答案 0 :(得分:2)
扩展方法只是常规静态方法的语法糖,因此它们将像以前一样工作,直到重新编译依赖程序集,此时编译器将找到新的实例方法并生成对它的调用。