Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重命名附带库中的公共类_C#_Dll_Deprecated_Backwards Compatibility - Fatal编程技术网

C# 重命名附带库中的公共类

C# 重命名附带库中的公共类,c#,dll,deprecated,backwards-compatibility,C#,Dll,Deprecated,Backwards Compatibility,我有一个已经发布的库(内部,但仍然发布),我想在库中重命名一个公共类 我想要的是一种确保 客户端代码继续工作 客户端代码在使用类名进行编译时收到一个弃用警告 是否有任何方法可以以某种方式对类进行别名,从而显示上述属性 将来有没有办法避免这个问题(除了确保类的命名和拼写正确之外?)请注意,我希望保留一个公共构造函数,因此使用接口不会解决所有问题 您可以为类提供任何公共别名,但可以将所有公共属性、方法等转发到重命名类的私有实例,并使用过时属性修饰类: [Obsolete("Please use L

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

我想要的是一种确保

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

  • 是否有任何方法可以以某种方式对类进行别名,从而显示上述属性

  • 将来有没有办法避免这个问题(除了确保类的命名和拼写正确之外?)请注意,我希望保留一个公共构造函数,因此使用接口不会解决所有问题

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

[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...");
    }
}

根据旧类的公共部分的大小,这项工作可能会非常繁琐,但您无能为力。

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

[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()
doitinomeotherway()
仅在类名上没有问题。如果只有类名是and issue,您可以重命名该类,并使用原始名称创建其子类。这个子类将需要定义调用基类构造函数的构造函数,并用ObsoleteAttribute修饰(正如这个答案所建议的),仅此而已。使用新类的代码将接受旧类的实例;遗憾的是,它不会反过来工作。在我的情况下,接口没有更改,因此public
DoTheOldWay()
doitinotherway()
仅使用类名没有问题。如果只有类名为and issue,则可以重命名该类并创建使用原始名称命名的子类。这个子类将需要定义调用基类构造函数的构造函数,并用ObsoleteAttribute修饰(正如这个答案所建议的),仅此而已。使用新类的代码将接受旧类的实例;不幸的是,它不会反过来工作。