通过它的名称动态调用/调用静态方法

时间:2014-04-07 14:52:13

标签: c#

我有一段代码:

public static OrderDraft ParseImportFile(Int32 TemplateId, String FTPUser, String CSVFilePath, Boolean IgnoreError = false)
{
    // Init
    OrderDraft myOrderDraft = new OrderDraft();

    // Anticipate Error
    try
    {
        // Load Sync Template Info
        SyncTemplateInfo mySyncTemplateInfo = Utils.GetTemplateInfo(TemplateId, IgnoreError);

        // Switch On Selected Template
        switch (TemplateId)
        {
            // Template #1
            case 1:
                myOrderDraft = Parsers.Template1.Parse(FTPUser, CSVFilePath, mySyncTemplateInfo, IgnoreError);
                break;

            // Template #2
            case 2:
                myOrderDraft = Parsers.Template2.Parse(FTPUser, CSVFilePath, mySyncTemplateInfo, IgnoreError);
                break;
        }
    }
    catch { }

    // Finished
    return myOrderDraft;
}

其中Parsers是文件夹/命名空间的名称。 TemplateN是该类的名称。

我希望能够做的是动态调用静态方法,而不是使用switch case并反复复制相同的代码(我可能会开发超过10个解析器)。

知道如何实现这一目标吗?我看了一下https://stackoverflow.com/a/1418228/2332336,但我不知道如何为我自己的代码做这个...

1 个答案:

答案 0 :(得分:0)

我希望以下内容可能有所帮助

        string Parsers = "...";
        string TemplateN = "...";
        string MethodName = "...";

        var q = from t in Assembly.GetExecutingAssembly().GetTypes()
                where t.IsClass && t.Namespace == Parsers && t.Name == TemplateN
                select t;

        Type classType = null;

        foreach (var item in q)
        {
            classType = item;//select the first match
            break;
        }

        if (classType == null)
        {
            return; //no matched class
        }

        MethodInfo mf = classType.GetMethod(MethodName);

        if (mf  == null)
        {
            return; //no matched method
        }

        myOrderDraft = mf.Invoke(new object()/*Sender*/,new object[]{}/*parameters*/);