Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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# - Fatal编程技术网

C#-过时的东西,将其标记为错误,但仍要访问它?

C#-过时的东西,将其标记为错误,但仍要访问它?,c#,C#,[过时]很好,我想用它来阻止访问,但为导入旧代码库并升级其数据的(临时)升级/移交代码提供豁免 旧类具有一些需要废弃的属性 我需要防止任何人再次意外地使用这些属性——强迫他们升级他们的代码库 …但我还需要编写一个工具,自动导入旧属性并将其转换为替换属性 注:转换是不平凡的。。。多对多转换。。。并适用于大量遗留项目,跨越由第三方维护的项目 我已经写了一个有效的自动升级系统,可以将旧的转换成新的。。。但我似乎无法将其与“过时的(…,true)”一起发布。我的拙见是,您试图实现的目标没有多大意义,因为

[过时]很好,我想用它来阻止访问,但为导入旧代码库并升级其数据的(临时)升级/移交代码提供豁免

  • 旧类具有一些需要废弃的属性
  • 我需要防止任何人再次意外地使用这些属性——强迫他们升级他们的代码库
  • …但我还需要编写一个工具,自动导入旧属性并将其转换为替换属性
  • 注:转换是不平凡的。。。多对多转换。。。并适用于大量遗留项目,跨越由第三方维护的项目


    我已经写了一个有效的自动升级系统,可以将旧的转换成新的。。。但我似乎无法将其与“过时的(…,true)”一起发布。

    我的拙见是,您试图实现的目标没有多大意义,因为它要么是过时的,只是一个允许调用旧代码的建议[过时的(“使用Xyz”,false)],要么使用新的实现并使用它是至关重要的[过时(“使用Xyz代替”,正确)]这当然是一个容易打破的变化

    但是,如果您仍然需要实现您的计划,您可以选择以下选项:

    • 倒影
    • 接口
    以下是两者的一个示例:

    class Program {
    
        static void Main(string[] args) {
            Foo myFoo = new Foo();
            //myFoo.OldMethod(); //Cannot be called
            myFoo.NewMethod();
            //Invocation through reflection (ugly but works also with foreign code)
            myFoo.GetType().GetMethod(nameof(Foo.OldMethod)).Invoke(myFoo, null);
            //Invocation through special interface (nicer but works only with own code)
            ((ILegacyFoo)myFoo).OldMethod();
        }
    
    }
    
    public interface ILegacyFoo {
    
        void OldMethod();
    
    }
    
    public class Foo 
        : ILegacyFoo {
    
        [Obsolete("Use NewMethod() instead.", true)]
        public void OldMethod() {
            OldMethodImplementation();
        }
    
        public void NewMethod() {
            Console.Out.WriteLine("New code called...");
        }
    
        private void OldMethodImplementation() {
            //Do something
            Console.Out.WriteLine("Old code called...");
        }
    
        void ILegacyFoo.OldMethod() {
            OldMethodImplementation();
        }
    
    }
    

    我发现很难从中找出真正的问题。你的最后一句话中有一个问号,但实际上似乎不是一个问题。你能试着解释一下你想做什么吗?(目前我正在努力想象答案会是什么样子…)@JonSkeet很抱歉这么说,问题是:(问题的标题)可能吗?@HansPassant:
    [过时]
    默认情况下会生成警告。如果您指定它应该是,则这只是一个错误。