【问题标题】:C# convert string to class that has a constructor with string parameterC# 将字符串转换为具有带字符串参数的构造函数的类
【发布时间】:2016-08-16 16:20:20
【问题描述】:

我已经看到了有关如何将字符串转换为类类型的示例,但是我无法将相同的逻辑应用于具有构造函数的类,该构造函数本身将字符串作为参数。这是我在其他帖子上看到的。

Type type = Type.GetType("classNameAsString");
object instance = Activator.CreateInstance(type);

我想要做的是将同样的应用到这个案例中

public class ExampleClass
{
    public ExampleClass(string strParameter)
    {
    }
}

我通常会将 ExampleClass 实例化为

var exClassInst = new ExampleClass("stringParam");

我怎样才能做到这一点,但首先将“ExampleClass”字符串转换为类型,然后实例化它。感谢您的帮助。

【问题讨论】:

    标签: c# types


    【解决方案1】:

    您可以尝试找到构造函数并调用它。

    ConstructorInfo ci = type.GetConstructor( BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null );
    return (ExampleClass)ci.Invoke( new Object[] { "stringParam" );
    

    【讨论】:

      【解决方案2】:

      您仍然可以使用Activator,但使用CreateInstance 与构造函数参数重载:

      Type type = Type.GetType("Namespace.ExampleClass");
      object instance = Activator.CreateInstance(type, "string param");
      

      【讨论】:

      • 感谢您的快速回复。使用字符串参数创建实例似乎很好,但是,当我尝试通过 instance.DoSomething() 访问类方法时,我收到一个错误 - 对象不包含 DoSomething 的定义......当我实例化类常规方式,我可以看到类方法。不知道发生了什么。
      • @user2217057:那是因为CreateInstance 将实例返回为object,您必须将其强制转换为ExampleClass 才能使用该类的正确成员。
      • 如果类类型是根据给定的字符串类型在循环中动态决定的,你将如何进行转换?我可能会遗漏一些东西,但如果类类型已知,则将对象类型转换为特定的类类型会起作用。
      • 如果您在编译时不知道类型,则需要使用反射访问成员。在你之前的评论中你说你不能调用 DoSomething() 但如果你不知道类型,你如何知道这个方法,如果是一个基本方法,你可以将对象转换为基本类型,否则你需要反思
      【解决方案3】:

      Activator.CreateInstance 已经有以下overload

      使用构造函数创建指定类型的实例 与指定参数最匹配。

      public static object CreateInstance(
          Type type,
          params object[] args
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        相关资源
        最近更新 更多