我从api文档中了解到ReflectionOnlyGetType返回一个类型,就像GetType一样。区别在于,使用ReflectionOnlyGetType加载的类型仅用于反射,而不用于执行。

那么,为什么要这样做:

    Type t = Type.ReflectionOnlyGetType("System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false, false);
    ConstructorInfo[] cis = t.GetConstructors();
    foreach (ConstructorInfo ci in cis)
    {
        if (ci.GetParameters().Length == 0)
        {
            // ! no arg constructor found! let's call it!
            Object o = ci.Invoke(new Object[]{});
            Console.WriteLine("But wait, it was supposed to be reflection only??");
            Console.WriteLine(o.GetType().Name);
            List<String> lli = (List<String>)o;
            lli.Add("but how can this be?");
            Console.WriteLine(lli.Count);
            Console.WriteLine("I am doing a lot more than reflection here!");
        }
    }

我的问题是:除了反射(reflection)这种类型的成员之外,我似乎还能做更多的事情。当他们说类型“仅用于反射而不是用于执行”而加载时,我是否误解了“执行”?还是ReflectionOnlyGetType返回一个不同的类型(非反射专用),如果该类型已经被“加载”,并且由于在mscorlib中而被加载了呢?还是完全不同?

最佳答案

您正在从mscorlib加载一种类型,该类型已经被加载以供运行时执行。您可以检查部件上的ReflectionOnly属性,以查看它是否已加载到ReflectionOnly上下文中。在您的样本中

Type t = Type.ReflectionOnlyGetType("System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false, false);
Console.WriteLine(t.Assembly.ReflectionOnly); // prints False.

似乎对mscorlib的反射(reflection)有些受限制。从MSDN:



我猜这扩展到将当前执行上下文中的内容加载到仅反射上下文中。

它似乎可以与其他BCL程序集一起使用:
Console.WriteLine(Assembly.ReflectionOnlyLoad("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089").ReflectionOnly); // prints True

关于c# - ReflectionOnlyGetType与GetType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13488818/

10-13 06:55