我可以使用invoke来抽象类方法

时间:2016-02-16 12:06:11

标签: c# generics

如下面的代码,我只想知道我可以将Invoke()用于抽象类

public abstract class genericDefine
{
    public void Foo<T>(T item)
    {
        Console.WriteLine(typeof(T).Name);
    }
}

var bar = typeof(Bar);
var fooMethod = typeof(genericDefine).GetMethod("Foo");
var fooOfBarMethod = fooMethod.MakeGenericMethod(new[] { bar });
fooOfBarMethod.Invoke(new genericDefine(), new object[] { new Bar() });

我也试过使用Derived类对象,但它对我不起作用....!

3 个答案:

答案 0 :(得分:4)

您必须将方法设为静态,或者传入实例以调用方法。如果没有实际拥有实例,则无法调用实例方法(并且无法实例化抽象类)。

所以这个(使用实例):

public class genericDefineInstance : genericDefine
{ }


...
fooOfBarMethod.Invoke(new genericDefineInstance(), new object[] { new Bar() });

或(使用静态方法):

public static void Foo<T>(T item)
{
    Console.WriteLine(typeof(T).Name);
}

...
fooOfBarMethod.Invoke(null, new object[] { new Bar() });

答案 1 :(得分:1)

为了在不传入对象实例的情况下调用MethodInfo,您需要将该方法定义为static。因此,如果您的方法被定义为这样,它确实有效。否则,您需要拥有抽象基类的子类实例。

 public abstract class AbstractClass
 {
     public static void Foo<T>(T item)
     {
         Console.WriteLine(typeof(T).Name + ": " + item);
     }
 }

但为什么班级为abstract

  1. 您需要一个继承abstract
  2. 的类中的实例
  3. 或者,你需要制作方法static - 这违背了abstract类的目的
  4. Here is the .NET fiddle.

答案 2 :(得分:0)

不,你不能。要调用您的方法,您仍然需要该类的实例,并且您无法创建抽象类的实例。