我已经在这方面搜索了一段时间,因为我天生健忘,我认为构建一些东西(抽象类、接口(interface)等?)来迫使我实现某些代码会很好在我正在写作的类里面。
特别是,我想强制一个新类始终具有一个构造函数,该构造函数采用单个参数作为其自身类型,以便更轻松地复制对象。我在其他地方看到过谈论此问题的文章/问题,但我不确定是否有人提出过这个特定问题(至少我能找到),或者我只是对其他文章/问题了解不够,无法意识到这一点。提前致歉。
我对让抽象类、接口(interface)等中的构造函数实际执行任何操作不感兴趣。我只是对在派生类中定义构造函数签名的要求感兴趣。
我理想的类(class)是这样的:
public class GoodClass
{
public GoodClass(GoodClass goodClass)
{
// copy components of goodClass to this instance
}
}
因此,我首先开始研究接口(interface),并开始阅读抽象类。我本以为下面的代码会起作用,但可惜我遇到了错误。我想做的事情可能吗?有没有其他方法可以实现我的目标,而无需在显示器上贴便签? :)
abstract class SelfConstructor
{
abstract public SelfConstructor(SelfConstructor) { }
}
class NewClass : SelfConstructor
{
//Required by SelfConstructor:
public NewClass(NewClass newClass)
{
// copy components of newClass to this instance
}
}
最佳答案
您可以编写一个 ReSharper 插件来识别这种情况并突出显示该类(如果它没有“复制构造函数”)。这将是 daemon stage这将在编辑文件时对其进行处理,并添加突出显示。您可以查看文件的抽象语法树,查找 IConstructorDeclaration
的所有实例,然后从 ParameterDeclarations
属性获取构造函数的参数。您可以检查是否存在一个只有一个参数的构造函数,并且该参数与声明它的类的类型相同。
您可以通过获取构造函数参数的 TypeUsage
并尝试向下转换为 IUserTypeUsage
来比较类型。然后,您可以使用 ScalarTypeName.Reference.Resolve()
获取 IDeclaredElement
的实例。将其与类的 IClassDeclaration.DeclaredElement
进行比较,看看它们是否是同一个实例。
关于C#:使用抽象类强制构造函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26109685/