【发布时间】:2017-03-13 00:35:30
【问题描述】:
Here 是一个高度赞成的解决方案,可以轻松地将嵌套类构造函数限制为仅父类。我正在尝试实现这一点,但在包含嵌套 generic 类的父类的上下文中。为了清楚起见,这里是原始的 sn-p:
public class Journal
{
private static Func<object, JournalEntry> _newJournalEntry;
public class JournalEntry
{
static JournalEntry()
{
_newJournalEntry = value => new JournalEntry(value);
}
private JournalEntry(object value)
{
...
这是我目前所在的位置(为简单起见,我将 Func<object,JournalEntry> 替换为简单的 Func<JournalEntry>。)
public class Journal
{
private static Func<JournalEntry> _new;
public JournalEntry<T> NewJournalEntry<T>()
{
return (JournalEntry<T>)_new();
}
public Journal(){}
public class JournalEntry {}
public class JournalEntry<T>:JournalEntry
{
static JournalEntry()
{
_new = () => new JournalEntry<T>();
}
private JournalEntry()
{
}
}
}
这是用例:
Journal j = new Journal();
Journal.JournalEntry<string> stringEntry = j.NewJournalEntry<string>();
//Fails with null reference exception
根据原始 sn-p 的此评论,
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor可以挽救这一天。 :)
我试了一下:
Journal j = new Journal();
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(Journal.JournalEntry<string>).TypeHandle);
Journal.JournalEntry<string> stringEntry = j.NewJournalEntry<string>();
//Passes
上面的代码有效。以下作品:
Journal j = new Journal();
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(Journal.JournalEntry<string>).TypeHandle);
Journal.JournalEntry<string> stringEntry = j.NewJournalEntry<string>();
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(Journal.JournalEntry<int>).TypeHandle);
Journal.JournalEntry<int> intEntry = j.NewJournalEntry<int>();
但尝试请求另一个 JournalEntry<string> 失败:
附加信息:无法将 JournalEntry[System.Int32] 类型的对象转换为 JournalEntry[System.String] 类型。
我该如何解决这个难题,以便我可以创建任意数量的 JournalEntry<> 的任何类型的实例?
【问题讨论】:
标签: c#