对泛型类型的静态成员的反思

时间:2016-01-02 01:30:14

标签: c# .net reflection

我有以下课程。

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

1 个答案:

答案 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

     

=================

     

字符串值

     

=================