如果你的类不是太复杂,你可以使用一个公开可见的接口,并将实际实现类设置为私有,或者你可以为
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);
}
}
这应该可以让你获得所需的可见性级别,而无需使用缓慢的反射或引入其他类/接口。