【问题标题】:How do I create an instance from a string in C#?如何从 C# 中的字符串创建实例?
【发布时间】:2010-10-13 11:40:24
【问题描述】:

我正在从一个 XML 中读取信息,其中包含我需要实例化的对象类型及其构造函数参数。

对象类型实际上在另一个项目中,在同级命名空间中。 (我需要在 Company.Project1 类中创建一个 Company.Project2.Type。)

我找到了this question,但它不处理构造函数参数或它在另一个命名空间中的事实。

我该怎么做?

编辑:项目属性中未正确设置程序集名称和默认命名空间。

【问题讨论】:

    标签: c# reflection


    【解决方案1】:
    • 您需要将完整的类型名称指定为Type.GetType(),包括命名空间,例如"Company.Project2.Type"
    • 如果类型不在同一个程序集(或 mscorlib)中,您还需要提供程序集名称,如果它是强类型的,则包括版本信息。例如,对于非强类型程序集 Company.Project2.dll,您可以指定“Company.Project2.Type, Company.Project2”。
    • 要使用参数调用构造函数,您可以调用Activator.CreateInstance(Type, Object[]) 或使用Type.GetConstructor() 获取所需的确切构造函数,然后调用ConstructorInfo.Invoke()

    如果这没有帮助,请提供更多信息。

    【讨论】:

    • Type.GetType() 似乎没有找到我给它的字符串的类型。类 Prop 定义在 Reaver.GamePlay 命名空间中,但返回类型为 null。
    • 我也试过 "Reaver.GamePlay.Prop, Reaver.GamePlay" 无济于事。
    • @Ben:它在什么程序集中?程序集是强类型的吗?
    • @JonSkeet 我相信使用此代码生成 String 对象是不可能的 - 因为它没有构造函数。(恕我直言)....您能否提供字符串的替代方案?
    • @RoyiNamir:string 有多种构造函数。看看 MSDN。但在字符串的情况下,直接使用字符串数据可能值得特殊情况。
    【解决方案2】:

    如果您想在运行时动态创建类型,Activator.CreateInstance 方法将为您完成。如果您的问题是具有带参数的构造函数的类型,则此重载将执行此操作。 例如, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

    我建议查看重载以找到最佳匹配。

    命名空间问题不应该是相关的 - 只要 dll 在 bin 目录或 GAC 中,您应该没问题。如果程序集是强命名的,规则可能会改变。

    您能否提供不起作用的代码的代码片段(使用您链接到的方法)?这+您看到的错误将非常有帮助! [更新] 使用处理带参数的构造函数的 Activator.CreateInstance 的快速示例。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                BaseProduct b =(BaseProduct)System.Activator.CreateInstance(Type.GetType("ConsoleApplication1.Product")
                    ,new object[]{typeof(string)}, 
                    new object[]{"123"}
                );
                //Activator..::.CreateInstance Method (Type, array<Object>[]()[], array<Object>[]()[])
            }
        }
        public class Product: BaseProduct{
            public  Product(string id) { 
    
            }
            public string Id {get;set;}
    
    
       }
    
        public abstract class BaseProduct {
            abstract public string Id { get; set; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-30
      • 2017-03-15
      • 1970-01-01
      • 2015-07-22
      • 2014-03-22
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多