2016-02-16 46 views
-1

如下代碼,我只是想知道我可以使用的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() }); 

我也嘗試過使用派生類對象,但它不會爲我工作。 ...!

+0

的目的爲什麼不嘗試一下? – HimBromBeere

+0

簡單的回答:沒有。 (聯合國?)幸運的是,我不能發表這樣一個簡短的答案。 – HimBromBeere

回答

1

爲了調用MethodInfo沒有傳入對象的實例你需要將該方法定義爲static。所以如果你的方法是這樣定義的,它確實有效。否則,你需要有一個抽象基類的子類實例。

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

但是爲什麼這個班級是abstract

  1. 你要麼從繼承abstract
  2. 類需要一個實例,或者,你需要做的方法static - 這違背了abstract

Here is the .NET fiddle.

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() }); 
相關問題