C# 根据字符串名称实例化一个类

2023-12-01

让多个类做很多事情,我必须实例化其中一个类,填充一些属性并调用一个方法。样本将具有以下方法,例如

        public class Method100Response201
    {
        public string R1_01 { get; set; }
        public void DoSpecialThing()
        { Console.WriteLine ("Something Blue..}"); }
    }
    public class Method100Response404
    {
        public string R2_01 { get; set; }
        public void DoSpecialThing()
        { Console.WriteLine ("Something Old..}"); }
    }
    public class Method110Response200
    {
        public string R3_01 { get; set; }
        public void DoSpecialThing()
        { Console.WriteLine ("Something New..}"); }
    }

它们都在同一命名空间中的 Program 类中,我有机制来找出我需要哪个类:

       static void Main(string[] args)
    {
        int[] MethodResponse = DoSomethingHere (23, "something", true);
        string DerivedClassName = ResponseModel(MethodResponse[0], MethodResponse[1]);
        Console.WriteLine (
            "For method " + MethodResponse[0].ToString () 
            + " and response " + MethodResponse[1].ToString ()
            + " you must instantiate Class " 
            + DerivedClassName);
        Console.ReadKey ();

        //how do I do this????
        //const string objectToInstantiate = "MyProject.Domain.MyNewTestClass, MyTestProject";
        //var objectType = Type.GetType (objectToInstantiate);
        //dynamic instantiatedObject = Activator.CreateInstance (objectType) as ITestClass;
        // set a property value
        //instantiatedObject.Name = DerivedClassName;
        // get a property value
        //string name = instantiatedObject.Name;

        // call a method - output "Something Blue.."
        //Console.Write (instantiatedObject.DoSpecialThing ());

    }

    public static int[] DoSomethingHere (int param1, string param2, bool whatever)
    {
        int firstInt = 0; int secondInt = 0;
        //
        //lots of work here, I end up with method and selector.. 
        //
        firstInt = 100;
        secondInt = 201;
        return new int[] { firstInt, secondInt };
    }

    public static string ResponseModel(int method, int response)
    {
        string returnClass = String.Empty;

        switch (method)
            {
            case 100:
                if (response == 201)
                { Console.WriteLine ("Case 100,201"); returnClass = "Method100Response201"; }
                else
                { Console.WriteLine ("Case 100,404"); returnClass = "Method100Response404"; }
                break;
            case 110:
                Console.WriteLine ("Case 100,404"); returnClass = "Method110Response200";
                break;
            case 120:
                // ...
                break;
            }
        return returnClass;
    }

我尝试了一种叫做 Activator 的东西,我不是专家,这对我来说真的很重要。有人可以帮我吗? (我根据 SO 中发布的解决方案对我正在尝试的一些代码进行了评论。谢谢)。


这种技术称为反射,即从字符串调用实例。 我的调用类将是

public class Class1
{
    public string Property { get; set; } = "I'm class1";
    public void DoSpecialThings()
    {
        Console.WriteLine("Class1 does special things");
    }
}

接下来我在静态函数中创建一个实例,应该将所有类放在同一个命名空间中以便于控制

    public static dynamic GetClassFromString(string className)
    {
        var classAddress = $"NetCoreScripts.{className}";
        Type type = GetType(classAddress);

        // Check whether the class is existed?
        if (type == null)
            return null;

        // Then create an instance
        object instance = Activator.CreateInstance(type);

        return instance;
    }

和一个 GetType 方法

    public static Type GetType(string strFullyQualifiedName)
    {
        Type type = Type.GetType(strFullyQualifiedName);
        if (type != null)
            return type;
        foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
        {
            type = asm.GetType(strFullyQualifiedName);
            if (type != null)
                return type;
        }
        return null;
    }

我使用动态类型来快速实现,基本上可以使用接口进行显式编码。

    static async Task Main(string[] args)
    {
        dynamic instance = GetClassFromString("Class1");

        Console.WriteLine(instance.GetType().FullName); //NetCoreScripts.Class1

        Console.WriteLine(instance.GetType().Name); //Class1

        Console.WriteLine(instance.Property); //I'm class1

        instance.Property = "Class1 has been changed";
        Console.WriteLine(instance.Property); //Class1 has been changed

        instance.DoSpecialThings(); // Class1 does special things
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 根据字符串名称实例化一个类 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 如何使用 angular2 http API 跟踪上传/下载进度

    因此 有许多临时库支持 Angular2 中的上传 下载进度 我不知道如何使用本机 Angular2 http api 在上传 下载时显示进度 我想使用原生http api的原因是因为我想利用 围绕本机 http api 的 http 拦截
  • 如何在 Java 中从 SQL*Plus 以“SYS”身份连接到 Oracle

    我想连接到 Oracle 作为SYS来自 Java 中的 SQL Plus 但我无法连接 但我能够以名为的用户进行连接SCOTT 我的代码片段如下 public static void test script String fileName
  • Eclipse 表单部分工具栏中的切换按钮

    如何在 Eclipse UI Forms 的部分工具栏中实现切换按钮 如下图所示 我只找到向部分工具栏添加操作的示例 我认为关键是 IAction AS CHECK BOX toggleBotton new Action Messages
  • 使用附加构建器的导航栏上的 Firefox 扩展图标

    如何向 Firefox 添加一个图标 单击导航栏即可打开一个面板 Firebug 扩展就是一个例子 唯一不同的是我希望出现一个面板 Thanks 您可能想使用或查看此工具栏按钮库 https builder addons mozilla o
  • 如何渲染 DotML

    如何将 DotML 渲染成图表 据网站介绍here 从数据中获取图表需要三个步骤 首先 生成或手动键入包含 DotML 元素的 gt XHTML 或任何其他 XML 文件 Use http www martin loetzsch de DO
  • cout 语句中的调用顺序说明,后缀与前缀

    当我在打印测试时注意到实际值输出中出现意外情况时 我正在重载后缀和前缀 运算符并测试它们 作为示例 这是一个整数测试 int i 0 cout lt lt before prefix lt lt i lt lt prefixing lt l
  • 想要使从服务器端不可见的控件的客户端可见性变为真实

    我的页面中有一个文本框 其可见性从服务器端设置为 false 现在我想通过使用 java 脚本使其从客户端可见 这种情况下不能实现任何回发或部分回发
  • 并行高效地运行多个作业

    操作系统 Centos 我有一些30 000要运行的作业 或脚本 每项工作需要 3 5 分钟 我有48 CPUs nproc 48 我可以用40 CPUs to run 40 Jobs并行 请建议一些脚本或工具可以通过并行运行每 40 个作
  • 将面板保存为 JPEG,仅保存可见区域 c#

    我正在尝试保存 然后在 C 中打印面板 我唯一的问题是它只保存可见区域 当我向下滚动时它会打印出来 Bitmap bmp new Bitmap this panel Width this panel Height this panel Dr
  • Elasticsearch 自动完成建议器

    我想在 ES 中实现自动完成功能 我已经关注this来自 ES 文档的教程 我的索引是 properties suggest type completion titleKeyword type keyword 我将文本值放入titleKey
  • 如何将 SORM 框架与 Play 框架结合使用?

    I find SORM非常有趣且有前途 但我找不到将其与游戏指南集成的方法 安装 Play gt 2 1 0 使用 Play 指南生成项目 将适当的 SORM 和所选数据库的依赖项添加到生成的project Build scala e g
  • PropertyTester 的触发评估

    The 两年前的代码必须升级到E4 现在一堆东西不能用了 其中之一是IEvaluationService如果像这样使用
  • 没有标准回调签名的 MeteorwrappAsync 或 bindEnvironment

    我正在尝试打电话createTableIfNotExists在此 npm 包中 并在服务器端 Meteor 中同步执行此操作 https www npmjs com package azure storage 但是 回调签名的类型funct
  • 如何在 Scala 中将一个列表拆分为另一个列表

    我是 Scala 新手 我需要一个解决方案来解决我的问题 想象一下我有这些列表 val list1 List 1 2 3 4 5 6 7 8 9 10 11 val list2 List 6 5 我的愿望是使用 list2 拆分列表列表中的
  • 如何检测浏览器选项卡中的关闭?

    您好 我正在寻找有关关闭选项卡 不是浏览器 事件的信息 如果 Java 中存在用于小程序的事件 我想知道是否有相关事件或检查方法 我想捕获该事件并制作一个小弹出框 说明您的会话将过期或类似的内容 对于 java 或 Javascript 来
  • 使用 jqui_sortable 排序后 div 元素之间的间距扭曲

    在我的闪亮应用程序中构建一个非常好的附加功能 用户可以重新组织页面内的绘图 时 我遇到了一个问题 我注意到正在重新定位 排序 的 div 元素之间的间距在执行此操作时发生变化 导致之后的绘图未对齐 我已经尝试调整margin值为零 0或一定
  • 如何将自定义 Android.mk 与新的 gradle 构建系统一起使用

    我知道如何使用自定义Android mk与旧的梯度 sourceSets main jniLibs srcDir src main jni jni srcDirs disable automatic ndk build call call
  • 使用 Autodesk A360 中的 URN 创建查看器应用程序

    我创建了一个查看器应用程序 它使用两条腿身份验证并显示已上传到我自己的存储桶的项目 现在 我希望能够查看已上传到 Autodesk A360 的项目 而不是查看自己存储桶中的项目 为此 我已完成以下步骤 实现了三足认证 项目中的A360账号
  • 从元胞数组中的每个元胞中提取特定元素

    我有一个元胞数组A尺寸的10x10 说 每个单元依次包含一个5x20矩阵 我想选择 i j 每个单元格的元素 其中 i j 是循环内的索引 我可以跑4个for循环并轻松得到答案 它may甚至更快 因为已经多次讨论循环可能比 cellfun
  • C# 根据字符串名称实例化一个类

    让多个类做很多事情 我必须实例化其中一个类 填充一些属性并调用一个方法 样本将具有以下方法 例如 public class Method100Response201 public string R1 01 get set public vo