Ark-kun 使用泛型本质上在编译时生成唯一类型。对于泛型类型,任何静态成员对于特定的封闭泛型类型都是唯一的。这样,它的处理速度与标准静态成员查找一样快。
上面的用法等价于这样的:
public static class MyDict_String
{
public static string Value { get; set; }
}
public static class MyDict_Int32
{
public static int Value { get; set; }
}
MyDict_String.Value = MyDict_Int32.Value.ToString();
AFAIK,类型是“静态的”(因为你不能以这种方式定义多个)所以我不知道有一种方法可以绕过这个并保持静态编译的成员查找的相同性能。
否则(我认为)你最好的选择是创建一个通用实例类型,它包装自己的字典,System.Type
用于其键和System.Object
值,在插入/检索值时必须对其执行装箱/转换。
编辑:这是一个包装字典的简单实现:
public class MyTypedDict
{
private Dictionary<Type, object> Values = new Dictionary<Type, object>();
public T Get<T>()
{
object untypedValue;
if (Values.TryGetValue(typeof(T), out untypedValue))
return (T)untypedValue;
return default(T);
}
public void Set<T>(T value)
{
Values[typeof(T)] = value;
}
}
多想一想,有可能通过一些愚蠢的行为使用ExpandoObject
(http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx)来实现更像属性的语法,但我感觉这将是非常滥用的,我只能假设非常容易出现运行时错误。(另外它在编译时不会给你任何东西)
EDITx2:如果你真的想要不同的值集,你可以将它嵌套在另一个泛型类型中:
public static class ValueSets<T>
{
public static class MyDict<U>
{
public static U Value { get; set; }
}
}
使用如下:
ValueSets<int>.MyDict<string>.Value = "Hello ";
ValueSets<bool>.MyDict<string>.Value = "World!";
string helloworld = ValueSets<int>.MyDict<string>.Value + ValueSets<bool>.MyDict<string>.Value;
Console.WriteLine(helloworld);//Hello World!
但是在这种情况下,初始类型变得“神奇”int
并且bool
没有意义,而且您需要为每个想要使用的不同值集提供唯一类型。另外,您不能将其传递并修改为实例变量,而是可以静态访问(只要您有权使用 type T
)。因此,也许您可以声明以含义命名的最小可见类型并使用它们:
internal class MyFirstWords {}
internal class MySecondWords {}
ValueSets<MyFirstWords>.MyDict<string>.Value = "Hello ";
ValueSets<MySecondWords>.MyDict<string>.Value = "World!";
string helloworld = ValueSets<MyFirstWords>.MyDict<string>.Value + ValueSets<MySecondWords>.MyDict<string>.Value;
Console.WriteLine(helloworld);//Hello World!
无论如何,我认为这很古怪,我不会推荐它。