C# 创建不重复要调用的代码的类

C# 创建不重复要调用的代码的类,c#,class,revit-api,C#,Class,Revit Api,对不起,如果标题不清楚,我不知道如何命名我要找的 我正在为Revit创建一个加载项,用于在Revit界面上创建按钮,单击按钮时,加载项将从内存中调用dll 要实现IExternalApplication来创建按钮,我需要创建一个类Invoke01(硬编码?),并在字符串中引用它(这是反射吗?) //ButtonsApp.dll //+--ThisApplication.cs 命名空间按钮应用程序 { [Autodesk.Revit.Attributes.Transaction(Autodesk.

对不起,如果标题不清楚,我不知道如何命名我要找的

我正在为Revit创建一个加载项,用于在Revit界面上创建按钮,单击按钮时,加载项将从内存中调用dll

要实现IExternalApplication来创建按钮,我需要创建一个类Invoke01(硬编码?),并在字符串中引用它(这是反射吗?)

//ButtonsApp.dll
//+--ThisApplication.cs
命名空间按钮应用程序
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.DB.Macros.AddInId(GlobalVars.AddInId)]
公共类此应用程序:IExternalApplication
{
启动时的公共结果(uicontrolLED应用程序uiApp)
{
//…等等
PushButtonData pushButtonOne=新的PushButtonData(ButtonName,
我的名字,
exeConfigPath,
“ButtonsApp.Invoke01”);//调用类
//…等等
}
}
}
然后,硬编码类将另一个dll加载到内存中

//ButtonsApp.dll
//+--Invokers.cs
命名空间按钮应用程序
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
公共类Invoke01:IExternalCommand
{
公共结果执行(ExternalCommandData commandData、ref字符串消息、ElementSet元素)
{
尝试
{
字符串assemblyPath=调用路径;
//将dll加载到内存以执行命令的代码
字符串strCommandName=CMD\u NAME;
//还有代码吗
返回结果。成功;
}
捕获(例外情况除外)
{
Utils.CatchDialog(例如,CMD_NUM);
返回结果,失败;
}
}
}
}
我必须为我现在拥有的六个外接程序编写这篇文章,因此重复了很多代码

我的第一个问题是?这些“硬编码”类实际上是如何调用的?

理想情况下,我想将Invoke 01的所有代码包装在一个基类中?(同样,我不确定我需要寻找什么)因此我不必每次创建新按钮时都重复所有代码

我只想定义INVOKE_PATH、CMD_NAME和CMD_NUM,然后调用完成其余工作的基类

我认为使用类继承、抽象类或接口将是一种可行的方法。 对于第一个,我不确定如何实现它,对于最后两个,据我所知,它们只是为类提供了“蓝图”

谢谢

我只想定义INVOKE_PATH、CMD_NAME和CMD_NUM,然后调用完成其余工作的基类

不确定我是否理解正确,但我相信函数确实是您所要求的。基类将被过度使用

namespace ButtonsApp
{
    class DllUtilities
    {
        public static Result LoadAndInvoke(string assemblyPath, string commandName)
        {
            try
            {
                // >> here goes dll loading and invocation <<
                // ...
                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                Utils.CatchDialog(ex, CMD_NUM);
                return Result.Failed;
            }
        }
    }
}

它可能是次优的-你应该考虑缓存引用到加载的DLL,甚至可能在某个地方存储调用动作,但是这是另一个问题的素材。 我只想定义INVOKE_PATH、CMD_NAME和CMD_NUM,然后调用完成其余工作的基类

不确定我是否理解正确,但我相信函数确实是您所要求的。基类将被过度使用

namespace ButtonsApp
{
    class DllUtilities
    {
        public static Result LoadAndInvoke(string assemblyPath, string commandName)
        {
            try
            {
                // >> here goes dll loading and invocation <<
                // ...
                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                Utils.CatchDialog(ex, CMD_NUM);
                return Result.Failed;
            }
        }
    }
}

它可能是次优的——你应该考虑缓存引用到加载的DLL,甚至可能在某个地方存储调用动作,但是这是另一个问题的素材。我真的太专注于搜索和观察抽象和继承是如何工作的了,以至于我忘记了是函数做的。谢谢对于你答案的最后一部分,你的意思是使用MemoryCache类吗?@G-BC我的意思是使用字典将dll路径映射到加载的dll实例(无论使用哪种格式)。每当再次请求dll时,它可能会立即直接从字典中获取,而不是再次加载它。这一点在您提到它之后就很明显了。我真的太专注于搜索和观察抽象和继承是如何工作的了,以至于我忘记了是函数做的。谢谢对于你答案的最后一部分,你的意思是使用MemoryCache类吗?@G-BC我的意思是使用字典将dll路径映射到加载的dll实例(无论使用哪种格式)。每当再次请求dll时,可以直接从字典中获取它,而不是再次加载它。