如何从C#中的静态方法引用当前类的类型

时间:2015-03-04 12:12:13

标签: c# class reference

近几年来,我一直试图多次找到这个问题的答案,但我总是最终用解决方法将其扫地,通过参数传递类型来引用类类型。

我的项目是一个类库,实际上不应该允许这样做,因为类负责重要的数据库完整性,用户有时会通过简单地传递错误的类型来严重搞乱事情。我知道,通过运行时检查(这种情况)可以通过多种方式最大限度地减少这种情况,但它仍然会导致重复出现的问题,并且我希望通过适当的解决方案一劳永逸地结束它

基本上我正在寻找的内容相当于类的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));
    }
}

非常感谢任何建议。

3 个答案:

答案 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填写标记字段。