【问题标题】:C# casting object type to a class type that is not known yetC# 将对象类型转换为未知的类类型
【发布时间】:2016-05-11 04:52:06
【问题描述】:

我只是重新参考之前的帖子,因为我无法完全解决问题。 C# convert string to class that has a constructor with string parameter

我有一个循环,我试图将给定的字符串转换为类类型并实例化它们。这些类具有带有字符串类型参数的构造函数,该参数是数据库的连接字符串。

到目前为止,似乎还可以。 ExampleClass1,ExampleClass2,ExampleClass3...

Type type = Type.GetType("ExampleClass1");
object instance = Activator.CreateInstance(type, "connection_string_param");

但是,当我尝试通过 instance.DoSomething() 访问类方法时,我收到一个错误 - 对象不包含 DoSomething 的定义......当我以常规方式实例化类时,我可以看到该类方法。 Arturo Menchaca 建议进行转换,感谢他早些时候的帮助,但如果类类型尚不知道,将“对象”类型转换为“特定类类型”将不起作用。如果我尝试(类型)实例,它不起作用...... 任何帮助表示赞赏。

【问题讨论】:

  • 静态类型的全部意义在于编译器至少可以使用静态信息验证数据类型的正确性。显然,您在这里没有静态类型信息。那么编译器会验证什么呢? (它会发出什么?)另一方面,如果您想完全跳过类型检查并将重载决议委托给运行时类型,只需使用 dynamic 而不是 object
  • 很可能你只需要阅读一下接口是什么,然后为你的类实现一些接口。
  • 感谢您的建议,我不能在这里使用接口方法或类层次结构,因为类类型是由实体框架生成的。

标签: c# casting


【解决方案1】:

DoSomething() 未在 object 上定义。它在您的ExampleClass1 上定义,依此类推。

您可以将其设为dynamic 对象并直接调用它:

dynamic instance = Activator.CreateInstance(type, "connection_string_param");
instance.DoSomething();

或者,通过反射调用它:

object instance = Activator.CreateInstance(type, "connection_string_param");
instance.GetType().GetMethod("DoSomething").Invoke(instance, null);

但是,您应该重新考虑您的设计,因为这不是一个好主意...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多