我有一些像这样的 C# 代码(类文件 = Status.cs):
/// <summary>
/// Constructs a status entity with the text specified
/// </summary>
/// <param name="someParameter">Some parameter.</param>
public Status(string someParameter)
{
SomeProperty = someParameter;
}
/// <summary>
/// An example of a virtual property.
/// </summary>
public virtual string SomeProperty { get; private set; }
我想对它做三件事:
- 在其上执行 Resharper “具有支持字段的属性”
- 摆脱“私人集”并用常规“集”替换它
- 更改构造函数,使其初始化私有字段而不是属性
所以最终的结果应该是这样的:
/// <summary>
/// Constructs a status entity with the text specified
/// </summary>
/// <param name="someParameter">Some parameter.</param>
public Status(string someParameter)
{
_someProperty = someParameter;
}
private string _someProperty;
/// <summary>
/// An example of a virtual property.
/// </summary>
public virtual string SomeProperty
{
get { return _someProperty; }
set { _someProperty = value; }
}
我的问题是:有没有办法使用 Resharper API 来自动化这种类型的重构?
背景:
对于那些可能想知道我为什么要这样做的人,这是因为:
我正在升级 NHibernate (old=2.1.2.4000, new=3.3.1.4000) 和 Fluent NHibernate (old=1.1.0.685, new=1.3.0.0)。
我已经摆脱了旧的 NHibernate.ByteCode.Castle.dll 和配置文件中的相应行,所以我现在可以使用内置在最新 NHibernate 中的默认代理。
在 NHibernate 的新实现和 Fluent 的新版本之间,当我尝试构建和运行单元测试时似乎存在两个问题(其中一部分是 FxCop 抱怨,但无论如何):
a)由于“私有集”而引发异常,并且 b)由于正在构造函数中初始化虚拟属性而引发异常。
所以我发现如果我进行这些更改,它会编译并且单元测试通过。
所以这对一两个类来说很好,但是有超过 800 个类文件,谁知道有多少属性。
我确信有很多方法可以做到这一点(例如,使用反射、通过目录递归和解析文件等),但似乎 Resharper 是这样的合适工具。
任何帮助表示赞赏,谢谢,-Dave
- 回答“只需将其更改为受保护的集合就完成了”的答案:
不幸的是,事情并没有那么简单。
这是运行单元测试时发生的错误(在对任何类进行任何更改之前):
测试方法抛出异常:NHibernate.InvalidProxyTypeException:以下类型不能用作代理:.Status:方法 set_StatusText 应该是“公共/受保护的虚拟”或“受保护的内部虚拟”..Status:方法 set_Location 应该是“公共/受保护”虚拟”或“受保护的内部虚拟”
因此,如果我按照建议更改类(唯一的更改是将“私有集”更改为“受保护集”),项目将不会构建,因为:
错误 2 CA2214:Microsoft.Usage:“Status.Status(string, StatusLocation)”包含一个调用链,该调用链导致调用该类定义的虚拟方法。查看以下调用堆栈以了解意外后果:Status..ctor(String, StatusLocation) Status.set_Location(StatusLocation):Void C:\\Status.cs 28
这就是为什么还需要更改构造函数中初始化这些虚拟属性之一的任何语句的原因。
NHibernate 代理 (ByteCode.Castle) 的先前实现似乎并不关心“私有集”,而这个实现。
而且,不可否认,第二个错误是因为 FxCop,我可以在类上放置一个属性来告诉 FxCop 不要抱怨这个,但这似乎只是让问题消失了,在构造函数中初始化虚拟属性是,据我了解,无论如何都是不好的做法。
所以我的问题仍然存在。我最初描述的更改是我想做的更改。如何自动化这些更改?