【问题标题】:C# How to use a string to declare a typeC#如何使用字符串来声明类型
【发布时间】:2015-03-28 21:35:21
【问题描述】:

C#中可以用字符串声明类型吗?

代替:

MyType foo = bar;

你会有一个字符串“MyType”。

string typeString  = "MyType";
TypeOftypeString foo = bar;

显然我不知道这样做的正确方法。所以上面的例子只是表达我的想法的一种方式。

在 Unity3D 中,我可以在运行前将字符串设置为特定值。我可以使用该字符串来定义类型吗?即使这最终成为我的代码中不合逻辑的追求,这可能吗?如果是这样,你会怎么做?

编辑:扩展我所说的内容。 MyType 是应用程序中的一个类。我也有 MyOtherType 和 MyDifferantType。我希望能够将该字符串设置为“MyType”或“MyOtherType”,然后将该对象的已创建实例分配给该字段。我试图避免一个非常长的 if-else 链或 switch() 语句,其中我为对象可能遇到的每种类型都做了一个案例,即使该类型是在运行时之前设置字符串时预先确定的。

如果这似乎是一件愚蠢的事情,请告诉我。

【问题讨论】:

  • TypeOftypeString 永远是字符串,你的意思是 typeString 的值吗?
  • 你可以使用Activator.CreateInstance
  • TypeOftypeString 是我试图传达的一个例子。这不是一个功能示例。 “MyType”已在应用程序中创建,我只想在运行时根据我的字符串动态创建或分配该类型的新字段。
  • @douglasg14b:傻瓜的冒险。您只需要为您的类型提供一个通用接口,那么唯一需要开关或等效的地方就是您创建实例的地方。
  • 明白了,感谢您的反馈。我一定是对这个问题有洞见,完全忘记了我对接口的使用。如何关闭主题而不删除它?

标签: c# types


【解决方案1】:

这应该是一个解决方案:

var yourType= "yourType";
var theType = TheType.GetType(yourType, true);
var variable = (yourTypeCast)Activator.CreateInstance(yourType);

【讨论】:

    【解决方案2】:

    如果我理解正确,您想根据字符串中的名称实例化一个类。这是执行此操作的一种方法。

    var typeName = "someType";
    var type = Type.GetType(typeName, true);
    var instanceOfType = (someInterfaceCast)Activator.CreateInstance(type); //I like to use an interface cast here
    

    更新:就像提到的一些 cmets 一样,如果您可以避开这条路,最好这样做。

    【讨论】:

    • 如果你使用字符串来实例化一个类型,那么你不知道它的类型。充其量你可以说它是objectsomeInterfaceCast?这些信息是从哪里来的?
    • "someInterfaceCast" 是一个接口。这将允许您公开您希望在实例化类中找到的某些方法。该信息不是来自任何地方,它只是您对实例化类将具有哪些方法/属性的期望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多