Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/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#_Casting_Subclass - Fatal编程技术网

在c#中,是否有一种方法可以通过字符串强制转换子类的实例?

在c#中,是否有一种方法可以通过字符串强制转换子类的实例?,c#,casting,subclass,C#,Casting,Subclass,例如,假设你有 class Item { } class Book: Item { } 您有一个对象声明,例如 Item myBook = new Book(); 您可以使用代码将其强制转换为子类 Book myBookCasted = myBook as Book; 我想知道的是,是否有一个方法,可能是带有反射的方法,用字符串而不是类型名将实例转换为子类?比如: Book myBookCasted = myBook as "Book"; 当然是用正确的语法 谢谢。您

例如,假设你有

class Item { }
class Book: Item { }
您有一个对象声明,例如

Item myBook = new Book();
您可以使用代码将其强制转换为子类

Book myBookCasted = myBook as Book;
我想知道的是,是否有一个方法,可能是带有反射的方法,用字符串而不是类型名将实例转换为子类?比如:

Book myBookCasted = myBook as "Book";
当然是用正确的语法


谢谢。

您可以使用
dynamic
关键字执行类似操作:

using System;
using System.Collections.Generic;
using System.Linq;

namespace MorphTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Item myBook = new Book();
            dynamic myBookCasted = Convert.ChangeType(myBook, Type.GetType("MorphTest.Book"));
            Console.WriteLine(myBookCasted.GetType()); // Prints "MorphTest.Book"
        }
    }

    public class Item { }
    public class Book: Item { }
}

唯一需要记住的是,您必须使用.NET 4.0或更高版本,并且必须使用完全限定的名称(例如,它必须是
“MorphTest.Book”
,而不仅仅是
。显然,您将
MorphTest
更改为类所在的任何名称空间。

那么如何确定变量类型(在左手边)?你可以通过反射来做类似的事情,但这比你想要同意的@UnholySheep要详细得多。如果你已经可以访问类型
Book
,为什么还要费心把
myBook这样的语法写成“Book”呢
?也许这是一个,还有更多的故事。为什么你认为你需要这样的语法?你是否有一个更深层次的问题要解决,你认为这种方法就是解决这个问题的方法?是的,首先我可以使用var而不是子类名称,其次我的应用程序a游戏将动态数据存储为文本文件,以便能够转换到从文件中的子类的字符串名中选择一个特定的子类是一个潜在的需求。实际上,这可能还包括一个实例化情况;基本上,我想要更智能的RTTI,然后仅仅依赖一个if语句列表“if(myvar is Book)”。您是否可以重新编写您的答案,使其与您打算使用的方式更接近?您可能忽略了一个可以使用的模式,而不是最终尝试使用反射来解决此问题。听起来您只是想序列化/反序列化数据。“有人可以使用
动态
吗?当然。“应该”有人?可能没有。这里有一个很好的解释。答案可能是想指出链接中关于
dynamic
最适合做什么的一些想法。@SeanSkelly我理解
dynamic
应该用来做什么。为了说明这一点,我不鼓励OP这样编程。我只是指出有一种方法可以做到这一点,来回答他的问题。应该使用它吗?见鬼,不。不用担心-我的意思不是说你不知道
dynamic
应该用于什么,但未来的读者可能不知道。书面回答没有确认这些关于
dynamic
的详细信息,因此提供了更新答案的链接和建议那个信息。