簡體   English   中英

如何在C#中使用Namespace.Class動態調用方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM