例如,我们有以下由微软提供的代码
public class MagicClass
{
private int magicBaseValue;
public MagicClass()
{
magicBaseValue = 9;
}
public int ItsMagic(int preMagic)
{
return preMagic * magicBaseValue;
}
}
public class TestMethodInfo
{
public static void Main()
{
// Get the constructor and create an instance of MagicClass
Type magicType = Type.GetType("MagicClass");
ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
object magicClassObject = magicConstructor.Invoke(new object[]{});
// Get the ItsMagic method and invoke with a parameter value of 100
MethodInfo magicMethod = magicType.GetMethod("ItsMagic");
object magicValue = magicMethod.Invoke(magicClassObject, new object[]{100});
Console.WriteLine("MethodInfo.Invoke() Example\n");
Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue);
}
}
// The example program gives the following output:
//
// MethodInfo.Invoke() Example
//
// MagicClass.ItsMagic() returned: 900
MethodInfo magicMethod = magicType.GetMethod("ItsMagic");
如果我们将整个代码段都包含在我们选择的任何命名空间中,那么程序就会中断。
它引发的异常如下:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
答案 0 :(得分:2)
如果您阅读docs:
typeName
要获取的程序集限定名称。参见
AssemblyQualifiedName
。如果类型在当前执行的程序集中或在Mscorlib.dll中,则只需提供其名称空间限定的类型名称即可。
因此,当MagicClass
包含在命名空间中时,您至少必须 指定命名空间:
Type magicType = Type.GetType("YourNameSpace.MagicClass");
否则它将返回null
。
答案 1 :(得分:0)
动态获取名称空间(如果它在同一个名称空间中)。
string ns = typeof(TestMethodInfo).Namespace;
Type magicType = Type.GetType(ns + ".MagicClass");