[英]How can I dynamically call a method using Namespace.Class in C#?
我有一個這樣的事件:
private void btnStartAnalysis_Click(object sender, EventArgs e)
{
SqlConnectionStringBuilder objConnectionString = new SqlConnectionStringBuilder();
objConnectionString.DataSource = txtHost.Text;
objConnectionString.UserID = txtUsername.Text;
objConnectionString.Password = txtPassword.Text;
objConnectionString.InitialCatalog = Convert.ToString(cmbDatabases.SelectedValue);
string[] arrArgs = { objConnectionString.ConnectionString };
//Checks for the selectedItem in the cmbOpearions dropdown and make call to appropriate functions.
string assemblyName = cmbOperations.SelectedValue.ToString();
Assembly assembly = Assembly.LoadFrom(assemblyName);
Type localType = assembly.GetType("PrimaryKeyChecker.PrimaryKeyChecker");
IMFDBAnalyserPlugin analyser = (IMFDBAnalyserPlugin) Activator.CreateInstance(localType);
string response = analyser.RunAnalysis(objConnectionString.ConnectionString);
//show the response of the the function call
txtPluginResponse.Text = response;
}
我希望這條線是動態的:
Type localType = assembly.GetType("PrimaryKeyChecker.PrimaryKeyChecker");
其中PrimaryKeyChecker是名稱空間,另一個PrimaryKeyChecker是類。
但是我想創建其他名稱空間和類,因此有什么方法可以動態調用它們並像這樣將它們加載到組合框中。
public void SetOperationDropDown()
{
cmbOperations.DataSource = PluginManager.GetAllPlugins();
if(cmbOperations.Items.Count > 0)
{
cmbOperations.SelectedItem = cmbOperations.Items[0];
}
}
您幾乎回答了自己的問題! 假設您有一個在配置文件中配置或未配置的插件列表,那么您的PluginManager可以使用類似於以下代碼的方式從程序集中加載類型:
Type analyserType = typeof(IMFDBAnalyserPlugin);
foreach(Type t in assembly.GetTypes()) {
if(t.IsSubtypeOf(analyserType) {
plugins.Add((IMFDBAnalyserPlugin) Activator.CreateInstance(t));
}
}
如果沒有插件列表,則可以掃描目錄並執行與上述相同的操作。 您還可以考慮使用像MEF這樣的插件框架體系結構,它可以為您完成很多工作,並在運行時發現程序集和插件。
我認為Tom的答案可以幫助您填充一系列插件。 將它們綁定到組合框,然后在其中將文本/描述放入“類型”名稱,並將組合項的值綁定到實際的“類型”聲明。 然后您要求該事件為“動態” ...您可能是指泛型??? 然后,我建議將click_event中的代碼重構為私有方法,以便也可以從其他“位置”調用它。 然后在click_event中,從當前選定的項目中檢索選定的插件類型,並在對RunAnalysis的泛型函數調用中提供此插件,如下所示:
private void btnStartAnalysis_Click(object sender, EventArgs e)
{
if(cmbOperations.SelectedItem != null)
RunAnalysis<cmbOperations.SelectedItem.Value>();
}
private void RunAnalysis<T>()
{
//Checks for the selectedItem in the cmbOpearions dropdown and make call to appropriate functions.
//string assemblyName = cmbOperations.SelectedValue.ToString();
//Assembly assembly = Assembly.LoadFrom(assemblyName);
//Type localType = assembly.GetType("PrimaryKeyChecker.PrimaryKeyChecker");
IMFDBAnalyserPlugin analyser =
(IMFDBAnalyserPlugin) Activator.CreateInstance(T);
string response = analyser.RunAnalysis(objConnectionString.ConnectionString);
//show the response of the the function call
txtPluginResponse.Text = response;
}
另一種方法是僅對當前選擇的類型使用參數。 希望這可以幫助您解決問題或為解決方案帶來新想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.