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:
[过时]
默认情况下会生成警告。如果您指定它应该是,则这只是一个错误。