近几年来,我一直试图多次找到这个问题的答案,但我总是最终用解决方法将其扫地,通过参数传递类型来引用类类型。
我的项目是一个类库,实际上不应该允许这样做,因为类负责重要的数据库完整性,用户有时会通过简单地传递错误的类型来严重搞乱事情。我知道,通过运行时检查(这种情况)可以通过多种方式最大限度地减少这种情况,但它仍然会导致重复出现的问题,并且我希望通过适当的解决方案一劳永逸地结束它
基本上我正在寻找的内容相当于类的this
关键字或typeof(this)
表达式,而不是其实例。
以下是演示此问题的示例:
public abstract class Base
{
protected static void InitializeTaggedFields(Type aType)
{
...
}
}
// User defined custom class inheriting my Base class
public class StoreThis : Base
{
[Tag("something")]
string Field1;
[Tag("something")]
string Field2;
[Tag("something_else")]
string Field3;
// This constructor should be in the Base class because user has
// to pass the type of his current class each time to initialize
// the class.
public StoreThis()
{
InitializeTaggedFields(typeof(StoreThis));
}
}
非常感谢任何建议。
答案 0 :(得分:3)
我担心这是不可能的 - 这是一件好事。
简单的原因是在OOP中,基类不应该使用派生类固有的信息。
答案 1 :(得分:1)
除非我完全误解了一切,否则你想要的只是这个:
public abstract class Base
{
protected static void InitializeTaggedFields(Type aType)
{
// aType will be of the instantiated type:
// When a "StoreThis" is instantiated,
// aType.Equals(typeof(StoreThis)) is true,
// if a "StoreThat" was instatiated
// aType.Equals(typeof(StoreThat)) is true.
// etc, etc.
}
public Base()
{
InitializeTaggedFields(this.GetType());
}
}
// User defined custom class inheriting my Base class
public class StoreThis : Base
{
public StoreThis()
{
}
}
public class StoreThat : Base
{
public StoreThat()
{
}
}
可能,您希望将InitializeTaggedField设为私有,因为它没有在其他地方使用。
答案 2 :(得分:0)
虽然我不熟悉您的方案,但您可以查看the factory method pattern。您可以让工厂根据classtype填写标记字段。