我有以下课程。
class MyClass<T>
{
private static List<T> _Values;
public static List<T> Values
{
get { return (_Values = _Values ?? new List<T>()); }
}
}
我已经好几次使用它了。
MyClass<Int32>.Values.Add(1);
MyClass<String>.Values.Add("1");
是否有可能检索所有使用过的所有类型的List
并且现在使用反射在内存中?
像
这样的东西var lists = typeof(MyClass<>)
.MemoryOccurrences()
.Select(x => x.GetStaticVariable("Values")); // two lists expected in this case
答案 0 :(得分:1)
你不能用Reflection做,但你可以创建一个实例持有者,就像这样
public class MyClassInstanceHolder
{
private static Dictionary<Type, object> Instances { get; } = new Dictionary<Type, object>();
public static List<T> GetNewOrExistent<T>()
{
var type = typeof(MyClass<T>);
if (Instances.ContainsKey(type))
return (List<T>)Instances[type];
Instances.Add(type, MyClass<T>.Values);
return MyClass<T>.Values;
}
public static IEnumerable<object> GetAllInstances() => Instances.Select(i => i.Value);
}
然后你仍然可以使用它进行一些小改动
MyClassInstanceHolder.GetNewOrExistent<int>().Add(1);
MyClassInstanceHolder.GetNewOrExistent<int>().Add(2);
MyClassInstanceHolder.GetNewOrExistent<int>().Add(3);
MyClassInstanceHolder.GetNewOrExistent<string>().Add("string value");
你们都可以获得所有实例值。
foreach (var allInstance in MyClassInstanceHolder.GetAllInstances())
{
foreach (var o in (IEnumerable) allInstance)
Console.WriteLine(o);
Console.WriteLine("=================");
}
1
2
3
=================
字符串值
=================