我試圖從另一個組件從它的基類的靜態方法導出類動態調用,使用下面的代碼:另一個組件運行從派生類的基類方法動態
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);
您可能希望創建一個回答你的問題,並選擇將此作爲您的解決方案:) –
那豈不是更公平如果@Creep做了答案,我選擇它作爲解決方案?這是我的第一篇文章,我希望儘可能對克里普有禮貌,節省了很多未來的頭痛...... –
我的壞 - 我沒有意識到,蠕變的答案本質上是解決方案(幾乎沒有調整在你的實際代碼庫)。所以,我建議選擇他的答案作爲解決方案。 –