gpt4 book ai didi

c# - 创建基于编译器的非静态版本 "dictionary",其中键是类型

转载 作者:太空狗 更新时间:2023-10-30 01:06:52 26 4
gpt4 key购买 nike

有一个非常简单的技巧可以创建类似字典的结构,其中键是类型。该结构就像一个 Dictionary<Type, T?>键在哪里 Type对象和值是相应类型的实例。

这个美妙的结构与变量或数组一样快,因为“查找”仅由编译器/JITter 完成一次,并且正确的值引用被编译到您的程序中。

    public static class MyDict<T> {
public static T Value { get; set; }
}

您可以像这样使用该结构:

MyDict<string>.Value = MyDict<int>.Value.ToString();

问题是这个“字典”是全局性的。创建不同字典的唯一方法是创建不同的类。

如何创建一个类似的(最快的“查找”,无装箱)非静态结构? (没有代码生成。)

简单地说:我想要多个Dictionary<Type, object> -没有查找成本、类型转换和装箱的类似对象。

最佳答案

这是一种扩展问题中描述的方法的方法:

public class TypeDict
{
public T Get<T>()
{
return MyDict<T>.Values[this];
}
public void Set<T>(T value)
{
MyDict<T>.Values[this] = value;
}
private static class MyDict<T>
{
public static Dictionary<TypeDict, T> Values { get; private set; }

static MyDict()
{
Values = new Dictionary<TypeDict, T>();
}
}
}

现在我们可以像这样使用 TypeDict 了:

void X()
{
var a = new TypeDict();
var b = new TypeDict();

a.Set<int>(1);
a.Set<double>(3.14);
a.Set("Hello, world!");

//Note that type inference allows us to omit the type argument
b.Set(10);
b.Set(31.4);
b.Set("Hello, world, times ten!");

Console.WriteLine(a.Get<int>());
Console.WriteLine(a.Get<double>());
Console.WriteLine(a.Get<string>());

Console.WriteLine();
Console.WriteLine(b.Get<int>());
Console.WriteLine(b.Get<double>());
Console.WriteLine(b.Get<string>());
}

关于c# - 创建基于编译器的非静态版本 "dictionary",其中键是类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063940/

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