次のコードがあるとします。
static class Store<T> {
public static T A;
public static T B;
public static T C;
}
public static class Store {
public static Value A = new Value(<T>(v) => Store<T>.A = v); //just an example of what I want
public static Value B = new Value(<T>(v) => Store<T>.B = v); //just an example of what I want
public static Value C = new Value(SetC<T>); //just an example of what I want
public static void SetA<T>(T value) { Store<T>.A = value; }
public static void SetB<T>(T value) { Store<T>.B = value; }
public static void SetC<T>(T value) { Store<T>.C = value; }
}
public class Value {
Action<T><T> _valueChanger; //just an example of what I want
public Value(Action<T><T> valueChanger) { //just an example of what I want
_valueChanger = valueChanger;
}
public void SetValue<T> (T value) {
_valueChanger<T>(value); //just an example of what I want
}
}
Store.A.SetValue(42)
に値が保存されるように書きたいStore<int>.A
。それを実現するには、「私が望むものの単なる例」でマークされた行の代わりに何を書くことができますか? (辞書などを使用しないソリューションを検討したい)
質問
を言い換えると、クラスを変更しValue
(いくつかのフィールドを定義し、コンストラクターを記述し、メソッド Value.SetValue(T value) を記述します)、次のような方法で Value (A、B、C) 型の 3 つの異なる変数を構築します。呼び出すとStore.A.SetValue(42)
、値Store<int>.A
が 42 に変更されます。
クラスの別のバリエーション:
static class Holder<T> {
T Value { get; set; }
}
static class Store2<T> {
public static Holder<T> A = new Holder<T>();
public static Holder<T> B = new Holder<T>();
public static Holder<T> C = new Holder<T>();
}
public static class Store2 {
public static Value A = new Value2(Store2<>.A); //just an example of what I want
public static Value B = new Value2(Store2<>.B); //passing non-specific generic expression
public static Value C = new Value3({TFree}() => Store2<TFree>.C); //just an example of what I want
}
public class Value2 { //Non-generic class!
Holder{TFree}<TFree> _holder; //just an example of what I want
public Value(Holder{TFree}<TFree> holder) { //just an example of what I want
_holder = holder;
}
public void SetValue<T> (T value) {
_holder{T}.Value = value; //just an example of what I want
}
}
public class Value3 { //Non-generic class! (Another variation)
Func{TFree}<Holder<TFree>> _holderFactory; //just an example of what I want
public Value(Func{TFree}<Holder<TFree>> holderFactory) { //just an example of what I want
_holderFactory = holderFactory;
}
public void SetValue<T> (T value) {
Holder<T> holder = _holderFactory{T}(); //just an example of what I want
holder.Value = value;
}
}
解決策: 別の質問 ( C#で無料のジェネリック型パラメーターを使用してデリゲートをエミュレートするおよびC# で無料のジェネリック型パラメーターを使用してデリゲートをエミュレートする ) への回答を使用して、リフレクションとコレクションを使用しない簡単な解決策が見つかりました。解決策は、ジェネリック型が不明なジェネリック操作へのデリゲートです。そのようなものを作成する方法は?.