【问题标题】:Renaming a public class in a shipped library重命名已发布库中的公共类
【发布时间】:2013-03-22 10:08:38
【问题描述】:

我有一个已发货(内部但仍在发货)的库,我想重命名库中的一个公共类。

我想要一种方法来确保

  • 客户端代码继续工作
  • 客户端代码在编译使用类名时收到弃用警告

  • 有没有办法以某种方式给类起别名,从而表现出上述属性?

  • 以后有什么办法可以避免这个问题(除了确保类的命名和拼写正确?)请注意,我想保留一个公共构造函数,所以使用接口并不能解决我的所有问题。

【问题讨论】:

    标签: c# dll deprecated backwards-compatibility


    【解决方案1】:

    您可以为该类提供任何公共别名,但您可以将所有公共属性、方法等转发给重命名类的私有实例,并使用过时属性装饰该类:

    [Obsolete("Please use LatestGreatest instead.")]
    public class OldSchool
    {
        private LatestGreatest _Target;
    
        public OldSchool()
        {
            _Target = new LatestGreatest();
        }
    
        public void DoSomething()
        {
            _Target.DoSomething();
        }
    
        [Obsolete("Please use LatestGreatest.DoItInSomeOtherWay()")]
        public void DoTheOldWay()
        {
            _Target.DoItInSomeOtherWay();
        }
    }
    
    public class LatestGreatest
    {
        public void DoSomething()
        {
            Console.WriteLine("I'm so fresh and cool.");
        }
    
        public void DoItInSomeOtherWay()
        {
            Console.WriteLine("Let's do it...");
        }
    }
    

    根据您的旧班级的公共方面的规模,这项工作可能非常乏味,但您无能为力。

    【讨论】:

    • 在我的例子中,接口没有改变,所以 public DoTheOldWay()DoItInSomeOtherWay() 只有类名没有问题。
    • 如果只有类名和问题,您可以重命名该类并创建以原始名称命名的子类。这个子类将需要定义调用基类构造函数的构造函数并用 ObsoleteAttribute 装饰(正如这个答案所建议的那样),仅此而已。使用新类的代码将接受旧类的实例;可悲的是,它不会反过来工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多