如何使用类似类型的字符串?

时间:2019-07-14 19:52:47

标签: c# .net unity3d generics type-conversion

所需的类型具有存储在字符串中的名称,因此我无法在代码中将其用作查找对象的类型。

为了找到所需的对象,我尝试了多种方法将字符串用作类型,但是没有一种起作用。

levelN = "Level"+levelNumber;

第一次尝试:

var levelManager = FindObjectOfType< Type.GetType(levelN)>(); 

第二次尝试:

var type = Type.GetType(levelN);

var levelManager = FindObjectOfType< type.GetType()>(); 

第三次尝试:

var levelManager = FindObjectOfType< type>(); 

我创建了“类型”,该类型具有搜索对象所需的类型,但是当我在代码中使用该类型时,第一和第二个错误出现( cs1525 )。 第三次尝试显示:

  

错误CS0118:“类型”是变量,但其用法类似于类型

1 个答案:

答案 0 :(得分:1)

由于缺乏良好的minimal, complete, and verifiable code example,目前尚不清楚您要问什么。特别是,虽然您说要按类型检索对象,但是从您的帖子中并不清楚实际上是否有诸如$userAcct = new UserAccount(); $userAcct->create([ 'user_id' => $user->id, 'acct_id' => $accounts->id ]); Level1等名称的类型。

假设有,那么您应该只使用非通用的Level2重载,在此处记录:https://docs.unity3d.com/2018.4/Documentation/ScriptReference/Object.FindObjectOfType.html

然后,您可以传递实际的FindObjectByType(Type)对象,该对象可以通过调用Type.GetType(string)来检索。不过请密切注意文档:

  

typeName 字符串
  要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前执行的程序集中或在Mscorlib.dll中,则只需提供其名称空间限定的类型名称即可。

您不太可能通过例如方法的字符串Type

坦率地说,最好初始化自己的"Level1"表以查找“级别管理器”对象。假设您的“级别管理器”对象共享一个通用的基本类型,则可以将其用作字典的值类型,而不是Dictionary<string, object>

大概这是您的代码很少需要执行的操作。只要这种情况不经常发生,就可以了。不过,请注意Unity3d documentation中的指南:

  

通常的最佳做法是在生产代码中消除对objectObject.Find的所有使用。由于这些API需要Unity遍历内存中的所有GameObjects和Components,因此随着项目范围的扩大,它们会迅速变得不可用。