【问题标题】:how to create a list of classes where the class name is taken from the string in c#如何创建一个类列表,其中类名取自c#中的字符串
【发布时间】:2013-11-03 02:33:20
【问题描述】:

不要问我为什么,但我需要做到以下几点:
string cName = "ClassA";
List<cName> l = new List<cName>();
我该怎么做?

我的代码:
public void MergeForm(List<object> lModel)
{
string className = lModel[0].GetType().Name;
List<className> list = new List<className>();
}
对象 - 它是一个类

【问题讨论】:

  • 我不喜欢“不要问我为什么”。如果我们知道原因,我们也许可以提供更好的解决方案。在软件开发中,通向罗马的道路几乎总是不止一条。
  • 为什么要这样做? :)

标签: c# string list class


【解决方案1】:

使用Assemmbly.GetTypes:

var l = Assembly.GetTypes().Where(t => t.Name == "ClassA").ToList();

如果你有完整的类型名称,你可以使用Assemmbly.GetType

如果您有完整的类型名称和程序集限定名称,并且您寻找的类型在另一个程序集中,则使用Type.GetType

【讨论】:

  • 感谢您的回答,但它会引发异常:非静态字段、方法或属性 'System.Reflection.Assembly.GetTypes() 需要对象引用
  • @Sultan 很难猜。也许显示更多您的代码。另外,我介绍的方法很常用,找一些例子应该没​​有问题(从我提供的链接开始)。
【解决方案2】:

您不能将List<cName> 作为静态类型,但您可以创建实例:

IList l = (IList)Activator
    .CreateInstance(typeof(List<>)
    .MakeGenericType(Type.GetType(cName)));

cName 需要是完全限定名称。

【讨论】:

    【解决方案3】:

    看看Activator.CreateInstance方法。

    【讨论】:

      【解决方案4】:
      Type ac;
      string cName = "ClassA";
      switch (cName)
      {
      case "ClassA":
      ac = typeof(ClassA);
      break;
      case "ClassB":
      ac = typeof(ClassB);
      break;
      default:
      ac = typeof(System.String);    
      break;
      }
      var genericListType = typeof(List<>);
      var specificListType = genericListType.MakeGenericType(ac);
      var l= Activator.CreateInstance(specificListType);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 2013-03-05
        相关资源
        最近更新 更多