gpt4 book ai didi

c# - 这个嵌套类构造函数片段可以应用于泛型类吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:04 24 4
gpt4 key购买 nike

Here是一个非常受欢迎的解决方案,可以轻松地将嵌套类构造函数限制为仅父类。我正试图实现这一点,但在包含嵌套 generic 类的父类的上下文中。为清楚起见,这里是原始片段:

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

根据原始片段中的评论,

System.Runtime.CompilerServices.RuntimeHelpers.RunClassConst‌​ructor can save the day. :)

我试了一下:

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>失败:

Additional information: Unable to cast object of type JournalEntry[System.Int32] to type JournalEntry[System.String].

我该如何解决这个难题,以便我可以创建任意数量的 JournalEntry<> 实例?有什么类型的?

最佳答案

你的方法行不通,因为每次 JournalEntry<T> 的类型初始化器会运行(并且它会为每个 T 运行一次),它将覆盖 _new 的先前值, 打破其他 T 的 future 用法

相反,您可以这样做:

public class Journal
{
public JournalEntry<T> NewJournalEntry<T>()
{
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(JournalEntry<T>).TypeHandle);
return JournalEntryFactory<T>._new();
}

private static class JournalEntryFactory<T>
{
public static Func<JournalEntry<T>> _new;
}

public Journal() { }

public class JournalEntry { }

public class JournalEntry<T> : JournalEntry
{
static JournalEntry()
{
JournalEntryFactory<T>._new = () => new JournalEntry<T>();
}

private JournalEntry()
{

}
}
}

这样,就有一个单独的_new对于每个 T .

顺便说一句,我就是问你提到的问题的人。就其值(value)而言,我认为这种方法有点老套且容易出错。如果您的情况可行,我强烈建议您使用基于接口(interface)的方法,如 accepted answer .以下是您的情况:

public interface IJournalEntry<T>
{
}

public class Journal
{
public IJournalEntry<T> NewJournalEntry<T>()
{
return new JournalEntry<T>();
}

public Journal() { }

private class JournalEntry<T> : IJournalEntry<T>
{
public JournalEntry()
{

}
}
}

关于c# - 这个嵌套类构造函数片段可以应用于泛型类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42754952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com