如果您的类不是太复杂,您可以使用公开可见的接口并将实际的实现类设为私有,或者您可以为该类创建一个受保护的构造函数并拥有一个派生自公共构造函数JornalEntry
的私有类,该构造函数实际上是由您的.JornalEntryInstance
JornalEntry
Journal
public class Journal
{
public class JournalEntry
{
protected JournalEntry(object value)
{
this.Timestamp = DateTime.Now;
this.Value = value;
}
public DateTime Timestamp { get; private set; }
public object Value { get; private set; }
}
private class JournalEntryInstance: JournalEntry
{
public JournalEntryInstance(object value): base(value)
{ }
}
JournalEntry CreateEntry(object value)
{
return new JournalEntryInstance(value);
}
}
如果您的实际类太复杂而无法执行其中任何一项,并且您可以摆脱构造函数并非完全不可见的情况,您可以将构造函数设为内部,使其仅在程序集中可见。
如果这也不可行,您始终可以将构造函数设为私有并使用反射从日志类中调用它:
typeof(object).GetConstructor(new Type[] { }).Invoke(new Object[] { value });
现在我考虑一下,另一种可能性是在包含类中使用私有委托,该类是从内部类设置的
public class Journal
{
private static Func<object, JournalEntry> EntryFactory;
public class JournalEntry
{
internal static void Initialize()
{
Journal.EntryFactory = CreateEntry;
}
private static JournalEntry CreateEntry(object value)
{
return new JournalEntry(value);
}
private JournalEntry(object value)
{
this.Timestamp = DateTime.Now;
this.Value = value;
}
public DateTime Timestamp { get; private set; }
public object Value { get; private set; }
}
static Journal()
{
JournalEntry.Initialize();
}
static JournalEntry CreateEntry(object value)
{
return EntryFactory(value);
}
}
这应该为您提供所需的可见性级别,而无需诉诸缓慢的反射或引入额外的类/接口