假设我有以下代码。
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) 的变量,当我调用时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# 中使用免费泛型类型参数模拟委托 https://stackoverflow.com/questions/12878864/emulating-delegates-with-free-generic-type-parameters-in-c-sharp/12879105#12879105 and 在 C# 中使用免费泛型类型参数模拟委托 https://stackoverflow.com/questions/12878864/emulating-delegates-with-free-generic-type-parameters-in-c-sharp/12926979#12926979)。解决办法是委托泛型操作,其中泛型类型未知。如何创建这样的东西? https://stackoverflow.com/questions/12877550/delegates-to-generic-operations-where-the-generic-type-is-unknown-how-to-create/12967076#12967076.
使用数组存储值并使用索引通过属性访问它们
public static class Store<T>
{
public static readonly T[] Values = new T[3];
public static T A { get { return Values[0]; } set { Values[0] = value; } }
public static T B { get { return Values[1]; } set { Values[1] = value; } }
public static T C { get { return Values[2]; } set { Values[2] = value; } }
}
public static class Store
{
public static readonly Value A = new Value(0);
public static readonly Value B = new Value(1);
public static readonly Value C = new Value(2);
}
public class Value
{
private int _index;
public Value(int index)
{
_index = index;
}
public void SetValue<T>(T value)
{
Store<T>.Values[_index] = value;
}
public T GetValue<T>()
{
return Store<T>.Values[_index];
}
}
由于构造函数Value
不知道任何泛型类型参数,您不能有任何对特定类型的引用Store<T>
.
UPDATE
请注意以下事实:Store<T>
将为您提供的每个不同类型参数创建T
。看这个例子
Store.A.SetValue(42);
Store.A.SetValue("Douglas Adams");
Store.A.SetValue(new DirectoryInfo(@"C:\"));
Store.A.SetValue(new List<int>());
var x1 = Store.A.GetValue<int>(); // --> 42
var x2 = Store.A.GetValue<string>(); // --> "Douglas Adams"
var x3 = Store.A.GetValue<DirectoryInfo>(); // --> DirectoryInfo{ C:\ }
var x4 = Store.A.GetValue<List<int>>(); // --> List<int>{ Count = 0 }
通过使用调试器,您将看到四个不同的值存储在A
同时!因为它们有四种不同A's
存在于四种不同的Store<T>
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)