如何从命名空间内部正确使用GetMethod?

时间:2019-03-28 12:39:46

标签: c# methods reflection system.reflection methodinfo

例如,我们有以下由微软提供的代码

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.'

2 个答案:

答案 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");