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();
据我所知,类型是“静态的”(也就是说,你不能定义多个这样的类型),因此我不知道有什么方法可以绕过这个问题并保持与静态编译成员查找相同的性能。
否则,你最好创建一个通用实例类型,它包装了自己的字典,该字典使用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)实现更类似属性的语法,但我觉得这样做可能会非常滥用,而且很容易在运行时出错。(此外,在编译时它不会为您提供任何帮助)
编辑x2:如果您真的想要有不同的值集,您可以将其嵌套在另一个泛型类型中:
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
变得“神奇”且没有意义,此外您需要为每个不同的值集提供唯一的类型。此外,您无法将其传递并修改为实例变量,而是可以静态访问(只要您可以使用类型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!
无论如何,我认为这很古怪,我不建议这样做。
public static MyMonad<T> operator +(MyMonad<T> a, MyMonad<T> b) {return new MyMonad<T>(Operators.Addition<T, T, T>.Handler(a, b)); }
- Ark-kun