如何使用反射调用接受类型基类的参数的方法?

时间:2015-12-30 07:10:42

标签: c# reflection

我有类似下面的课程

public Class A
{    
    protected A()
    {
    }
}

Public class B : A
{
    public B()
    {
    }
}

我的方法如下

public class C{
    private void Method1(A obj)
    {
    }
}

使用反射的方法调用

MethodInfo method1= typeof(C).GetMethod("Method1", BindingFlags.NonPublic | BindingFlags.Instance);

var result = method1.Invoke(cObject, new object[] { objectB });

我试图使用反射调用这个私有方法,但我得到了Argument异常

  

发生了'System.ArgumentException'类型的异常   mscorlib.dll但未在用户代码中处理

     

“B”类型的对象无法转换为“A”类型。

有人能告诉我吗?

1 个答案:

答案 0 :(得分:2)

您的代码看起来很好,如果您想查看Method1中的类型,可以使用if(obj is B)作为我的示例

public class A
{    
    public A()
    {
    }
}

public class B : A
{
    public B()
    {
    }
}

public class C
{
    private void Method1(A obj)
    {
        if (obj is B)
        {
            Console.WriteLine("I'm B object!");
        }
        else
        {
            Console.WriteLine("I'm something else");
        }
    }
}

public class MainClass
{
    public static void Main()
    {
        B objectB = new B();
        A objectA = new A();
        C objectC = new C();

        MethodInfo method1 = typeof(C).GetMethod("Method1", BindingFlags.NonPublic | BindingFlags.Instance);

        method1.Invoke(objectC, new object[] { objectB });
        method1.Invoke(objectC, new object[] { objectA });
    }
}

控制台输出:

  

我是B

     

我是别的什么