Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中将字符串转换为类引用?_C#_String_Class_Reference - Fatal编程技术网

如何在c#中将字符串转换为类引用?

如何在c#中将字符串转换为类引用?,c#,string,class,reference,C#,String,Class,Reference,在c#中,我正在从事一项基于文本的冒险活动,其中每个互动程序都由一个类表示。在我的主类中,我插入了一种从控制台读取的方法,在我称为tile loader的类中,我有一个更新函数。此函数从开始读取的输入中获取字符串。当我调用它时,我希望字符串被转换成一个类引用,这样我就可以调用这个类,并且每个tile类中都有一个load函数。我可以直接插入很多if,但我真的不想这么做。我知道有一个更简单的方法。你可以用它来做这件事 您将需要提供程序集名称或引用,并且可能需要为类添加命名空间,除非您希望在命令行中提

在c#中,我正在从事一项基于文本的冒险活动,其中每个互动程序都由一个类表示。在我的主类中,我插入了一种从控制台读取的方法,在我称为tile loader的类中,我有一个更新函数。此函数从开始读取的输入中获取字符串。当我调用它时,我希望字符串被转换成一个类引用,这样我就可以调用这个类,并且每个tile类中都有一个load函数。我可以直接插入很多if,但我真的不想这么做。我知道有一个更简单的方法。

你可以用它来做这件事

您将需要提供程序集名称或引用,并且可能需要为类添加命名空间,除非您希望在命令行中提供完全限定的类

例如,假设类
Test
位于名为
WindowsFormsApplication1
的程序集中,并且用户条目位于名为
sInputClassName
的变量中,则以下代码将在
oClass
变量中创建该类的实例:

        // What the user entered
        var sInputClassName = "Test";

        // The name of the assembly; there are other ways to get this, such as through reflection
        const string CLASS_ASSEMBLY_NAME = "WindowsFormsApplication1";
        // Get the requested type from the entered class name and assembly name
        var oType = Type.GetType(CLASS_ASSEMBLY_NAME + "." + sInputClassName, true);
        if (oType != null) {
            // Once we have the class type, create an instance of it
            var oClass = Activator.CreateInstance(oType, false);
            if (oClass != null) {
                System.Diagnostics.Debug.WriteLine("Created " + sInputClassName);
            } else {
                System.Diagnostics.Debug.WriteLine("Could not create " + sInputClassName);
            }
        } else {
            System.Diagnostics.Debug.WriteLine("Could not find " + sInputClassName);
        }

最简单的方法是…一个字典(键=字符串,值=类的类型)。你也可以考虑反射(按名称或属性)。第一个解决方案更容易实现,但更难维护,第二个更容易扩展,但(IMO,有点)更容易出错(例如,因为本地化),例如(使用反射),请查看我不久前在这里发布的一个类似问题。代码很原始,所以把它当作一个起点。抱歉。我是c#的新手。我只是想知道你能否给我举个简单的例子,说明我是如何做到这一点的。欢迎你!请点击链接,这里有一些代码。谢谢。我会检查它。顺便说一句,我建议始终将
true
作为第二个参数传递给
Type.GetType
,如果由于某种原因无法加载该类型,则会导致它抛出一个描述良好的异常。我是根据经验说的,当您返回的全部为空时,调试生产代码中的类型加载错误非常烦人——烦人,因为如果某个开发人员多键入六个字符,我就可以节省很多时间。@MichaelLiu:捕捉得好,信息非常有用。我更新了答案以反映这一点。