2017-01-05 51 views
0

我試圖從另一個組件從它的基類的靜態方法導出類動態調用,使用下面的代碼:另一個組件運行從派生類的基類方法動態

Assembly executingAssembly = Assembly.GetExecutingAssembly(); 

Assembly objectAssembly = 
    Assembly.Load(executingAssembly.GetReferencedAssemblies(). 
    Where(a => a.Name == "WebDelightBLL").FirstOrDefault()); 

Type myType = objectAssembly.GetType("WebDelightBLL.Ingredient"); 

MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 

object myInstance = Activator.CreateInstance(myType); 

dgvResultsRES.DataSource = myMethod.Invoke(myInstance, null); 

守則該DLL如下:

public class BaseClass<DerivedClass> 
{ 
    public static Type MyType() 
    { 
     return typeof(DerivedClass); 
    } 
    public static string Prefix() 
    { 
     return "Sp" + MyType().Name; 
    } 
    public static DataTable GetAll() 
    { 
     try 
     { 
      DataTable dt = GetSP(Connection.connectionString(), 
       Prefix() + "GetAll", 5); 
      return dt; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 
public class Ingredient : BaseClass<Ingredient> 
{ 
    public string SayHello() 
    { 
     return "Hello, World!"; //Just to exemplify a point 
    } 
} 

但我總是得到「未將對象引用設置到對象的實例」

如果我打電話「的SayHello()」例如我沒有得到任何錯誤。

這甚至可能嗎?

更新:

通過添加BindingFlags.FlattenHierarchy蠕變指示它的工作就像一個魅力。工作代碼如下:

 Type myType = objectAssembly.GetType("WebDelightBLL.Ingredient"); 

     MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public 
      | BindingFlags.Static | BindingFlags.FlattenHierarchy); 

     //object myInstance = Activator.CreateInstance(myType); <-- not needed. 

     dgvResultsRES.DataSource = myMethod.Invoke(null, null); 
+0

您可能希望創建一個回答你的問題,並選擇將此作爲您的解決方案:) –

+0

那豈不是更公平如果@Creep做了答案,我選擇它作爲解決方案?這是我的第一篇文章,我希望儘可能對克里普有禮貌,節省了很多未來的頭痛...... –

+0

我的壞 - 我沒有意識到,蠕變的答案本質上是解決方案(幾乎沒有調整在你的實際代碼庫)。所以,我建議選擇他的答案作爲解決方案。 –

回答

1

由於您的方法在基類中是靜態的,所以它不屬於它的子類。
下面的代碼將工作:

Type myType = objectAssembly.GetType("WebDelightBLL.BaseClass"); 
MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 
myMethod.Invoke(null, null); 
+0

這裏的問題是它應該從派生類中調用,以保持代碼的動態性。 –

+1

只是一個猜測,但如果你在子類上工作並添加標誌| BindingFlags.FlattenHierarchy'類型myType = objectAssembly.GetType(「WebDelightBLL.Ingredient」); MethodInfo myMethod = myType.GetMethod(「GetAll」,BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); myMethod.Invoke(null,null);' – Creep

+1

太棒了! ;)FlatterHierarchy做了它... –

1

你試圖調用靜態方法,所以你不能指定對象的實例(擺脫「對象引用不設置到對象的實例」錯誤) 。而且,由於這種方法沒有任何參數,你可以創建一個空的參數數組

MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 
// dont need this 
//object myInstance = Activator.CreateInstance(myType); 

//dgvResultsRES.DataSource = myMethod.Invoke(myInstance, null); 
dgvResultsRES.DataSource = myMethod.Invoke(null, new object[0]); 
+0

它沒有工作。 –

相關問題