How can you cast to a type using the type name as a string?

后端 未结 4 1050
悲&欢浪女
悲&欢浪女 2021-01-12 12:00

Ok, I\'ve thumped on this idea all day now, and I have reached the part where I admit I just flat out don\'t know. It\'s possible that what I\'m doing is just stupid and the

相关标签:
4条回答
  • 2021-01-12 12:20

    According to what you have, FormWithWorker must be (at least) as base class of the type you are instantiating, so you can do this:

    FormWithWorker formToLoad = (FormWithWorker)fi.GetValue(this);
    if (formToLoad == null)
    {
        formToLoad = (FormWithWorker)System.Activator.CreateInstance("MyAssemblyName", formType);
    }
    
    0 讨论(0)
  • 2021-01-12 12:23

    This problem is usually resolved by casting to a common base class or interface of all potential types.

    In C# 4, you can also assign it to a dynamic variable to hold the return value and call arbitrary methods on it. The methods will be late bound. However, I prefer to stick to the former solution whenever possible.

    0 讨论(0)
  • 2021-01-12 12:24

    You'd be better off with the other overload that takes a Type and using e.g. Type.GetType(string).

    FormWithWorker formToLoad = (FormWithWorker)fi.GetValue(this);
    if (formToLoad == null)
    {
        formToLoad =
          (FormWithWorker)System.Activator.CreateInstance(Type.GetType("MyNamespace.MyFormType"));
    }
    
    0 讨论(0)
  • 2021-01-12 12:45

    While a common interface is one way to approach this problem, interfaces aren't practical for all scenerioes. The decision above is one of going with a factory pattern (switch statement - concrete class selection) or use reflection. There's a stack post that tackles this problem. I believe you can directly apply this to your issue:

    Method Factory - case vs. reflection

    0 讨论(0)
提交回复
热议问题