アークくんはジェネリクスを使って、基本的にコンパイル時にユニークな型を生成しています。ジェネリック型では、静的メンバーはその特定のクローズド ジェネリック型に固有です。このようにして、標準の静的メンバー ルックアップと同じくらい高速に処理されます。
上記の使用法は、次のようなものと同等です。
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 ) を使用して、よりプロパティに似た構文を達成することは可能かもしれませんが、私はこれはかなり乱暴で、実行時エラーがひどく発生しやすいとしか思えません。(さらに、コンパイル時に何も提供しません)
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!
とにかく、これは非常に風変わりであり、お勧めしません。