【问题标题】:Casting string to type [duplicate]将字符串转换为类型[重复]
【发布时间】:2016-04-25 11:38:46
【问题描述】:

有没有办法在运行时通过转换类型名称的字符串来指定类型?我希望下面的非编译代码可以解释我想要做什么。否则请告诉我,我会尝试更好地解释它。

var valueFromDropDownMenu = "MyClass";

List<Type.GetType(valueFromDropDownMenu)> dynamicList = 
  new List<Type.GetType(valueFromDropDownMenu) > (); 

// Code to iterate through objects and populate dynamicList 
// with all objects of correct type

我想做的是让用户选择我要处理的对象类型。

我正在使用 Unity3D,它是一个游戏开发框架,它使用静态方法从文件加载资源。这些资源需要投。

我正在尝试制作一个开发人员工具,让开发人员可以选择要加载的特定类型的资源。所以我需要做类似的事情

var files = LoadAll("Path, ofType(UserSelectedType)); 

有可能吗?

【问题讨论】:

  • 看看here,这应该能回答你的问题。
  • 我知道这并不能回答您的问题,但是您是否有可能创建一个所有这些类型都可以实现的接口,即无论它实际得到什么类型,您是否都想做相同的操作?
  • List&lt;Type.GetType(...)&gt; 不起作用 - 但您可能不需要它。我假设您已经有了要搜索的项目列表?如果是这样,为什么不使用相同的类型 - 因为所有找到的对象都将属于该类型或子类型?
  • 真的吗?我认为他从菜单中获取类名,并希望从这些字符串中创建新对象。 (valueFromDropDownMenu 毕竟是一个字符串!)如果他已经有对象,他可以尝试克隆它们..
  • @BarryO'Kane 它不能解决我的问题,因为当我尝试投射某些东西时,我可以使用 Type 类型。像这样 dosnt 工作: Type myType = GetType(namespaceQualifiedTypeName); myType instance = new myType();

标签: c# .net unity3d


【解决方案1】:

泛型的全部意义在于提供编译时类型。尝试以您描述的方式使用泛型会失败。

它无法编译,因为您试图将运行时类型与编译时类型混合。

即使这确实有效,它也会增加不必要的开销来使用简单的List&lt;object&gt;,然后可以在运行时查询类型信息。 (注意,编译时显然总是更可取的性能)

下面的代码将在控制台输出一行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {

            List<object> x = new List<object>();
            x.Add(new MyTypeA());
            x.Add(new MyTypeB());
            foreach (var itemsOfA in x.Where(o => o.GetType().Name == "MyTypeA"))
            {
                Console.WriteLine("Found a " + itemsOfA.GetType());
            }
        }
    }

    class MyTypeA { }
    class MyTypeB { }
}

【讨论】:

  • 感谢您的宝贵时间。我认为我的例子有点糟糕。我想做的是让用户选择我将处理的对象类型。我正在使用 Unity3D,它是一个游戏开发框架,它使用静态方法从文件中加载资源。这些资源需要投。我正在尝试制作一个开发人员工具,让开发人员可以选择要加载的特定类型的资源。
  • (continuing...) 所以我需要做类似 var files = LoadAll("Path, ofType(UserSelectedType)); 可能吗?
  • @Lautaro:您可能希望将该信息添加到您的问题中 - 特别是您如何获取这些对象以及您打算如何处理它们。
  • @JoeBlow 我想请你不要这么居高临下。我向你保证,我已经阅读了其他人提供的所有链接。请解释您的示例中的“WhateverYouWant”是什么以及如何使用它?这就是我想象的方式,这是行不通的。 var myType = Type.GetType("AudioClip"); var ra = Resources.LoadAll("path", typeof(myType)).Cast().ToArray();
  • @Nathan 感谢您的支持。我没有提出 Unity3D 特定的问题,因为我认为我可以从中学到 C# 编程的更基础知识。但是从您的链接中,我认为现在可能由于 Unity3D 的特定原因而无法按照我的想法进行。我可能会更好地使用 switch 语句和 2-4 个不同的选项。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2013-03-11
  • 2012-12-14
  • 1970-01-01
  • 2013-03-03
  • 2021-07-21
相关资源
最近更新 更多