Как я могу динамически вызывать метод, используя Namespace.Class в C #? - PullRequest
0 голосов
/ 12 декабря 2010

У меня есть такое событие:

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];
    }
}

Ответы [ 2 ]

1 голос
/ 12 декабря 2010

Вы почти ответили на свой вопрос! Предполагая, что у вас есть список плагинов, настроенных в файле конфигурации или еще чего-то, тогда ваш PluginManager может загрузить типы из сборки, используя код, подобный следующему:

Type analyserType = typeof(IMFDBAnalyserPlugin);
foreach(Type t in assembly.GetTypes()) {
    if(t.IsSubtypeOf(analyserType) {
        plugins.Add((IMFDBAnalyserPlugin) Activator.CreateInstance(t));
    }
}

Если у вас нет списка плагинов, вы можете отсканировать каталог и сделать то же самое, что и выше. Вы также можете рассмотреть возможность использования архитектуры инфраструктуры плагинов, например MEF , и она выполняет большую часть этой работы за вас и обнаруживает сборки и плагины во время выполнения.

0 голосов
/ 12 декабря 2010

Я думаю, что ответ Тома поможет вам заполнить список плагинов.Свяжите их с полем со списком, где вы поместите текст / описание к имени типа, и привяжите значение комбинированных элементов к фактическому объявлению типа.И вы попросили, чтобы это событие было «Динамичным» ... Вы, вероятно, имеете в виду общий характер ???Затем я бы посоветовал изменить код в 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;  
        }

Другим способом может быть просто использование параметра для типа в настоящее время.выбран.Надеюсь, это поможет вам или принесет вам новые идеи для решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...