这应该是一个愚蠢的问题,但我长期坚持:(
我有一个类,通用方法执行一些实体初始化。
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
事件或类似事件中访问此方法,以便仅在此时启用实体初始化。
答案 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
}
}
但是当然存在一个限制,即在初始化实体之后将执行派生的构造函数。