使派生类能够运行父私有方法

时间:2013-11-19 23:29:18

标签: c# .net oop events inheritance

这应该是一个愚蠢的问题,但我长期坚持:(
我有一个类,通用方法执行一些实体初始化。

public class Base
{
    private Base()
    {
        // do things
        // fire OnCreated event
    }
    private void InitializeEntity<T>()
    {
        // initialize entities of class T
    }
}

在创建类之后,必须对指定的实体执行此方法InitializeEntity。我不想让方法公开以防止它在不正确的点执行,但我需要任何派生类才能在OnCreated事件中执行此方法。我的问题是我不知道如何将这个私有方法暴露给派生类:(它应该像EF完成的那样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Parent>();
    modelBuilder.Entity<Child>();

    base.OnModelCreating(modelBuilder);
}

可能应该有另一种方法来实现这个目标。我感谢任何帮助 的更新
伙计们,“在创建类之后,必须对指定的实体执行此方法InitializeEntity。我不想让方法公开(应该说或受保护)以防止它在不正确的点执行”。我希望派生类不能在任何其他时间运行它,而是基类OnCreated事件。我希望他们只能在OnCreated事件或类似事件中访问此方法,以便仅在此时启用实体初始化。

2 个答案:

答案 0 :(得分:3)

改为protected

public class Base
{
    protected void InitializeEntity<T>()
    {
        // initialize entity class T
    }
}

如果您想确保只能从同一个程序集中的类调用它,您可能需要考虑将其设为internal(或者protected internal):

public class Base
{
    internal void InitializeEntity<T>()
    {
        // initialize entity class T
    }
}

请注意,这将允许从同一程序集中的任何类(或该程序集中InternalVisibleToAttribute引用的任何程序集)调用该方法,因此您可以确保正确使用它。 / p>

答案 1 :(得分:0)

如果您不必直接调用InitializeEntity<T>,只是想调用它,请将某种标志传递给基本构造函数。要解决T问题,可以使用Reflection。

public class Base
{
    protected Base(Type type = null)
    {
        // 1. Base constructor code
        if (type != null)
        {
            // this will to InitializeEntity<type>();
            MethodInfo method = typeof(Base).GetMethod("InitializeEntity", BindingFlags.NonPublic | BindingFlags.Instance);
            MethodInfo generic = method.MakeGenericMethod(type);
            generic.Invoke(this, null);
        }
    }
    private void InitializeEntity<T>()
    {
        // 2. Initialize entities of class T
    }
}

public class Derived : Base
{
    public Derived() : base(typeof(Entity))
    {
        // 3. Derived constructor code
    }
}

但是当然存在一个限制,即在初始化实体之后将执行派生的构造函数。