1

我有 100 个类都有相似的签名方法,只是它们的内部定义不同。我将传递一个类名作为字符串,我需要创建该类型的对象并调用方法。我知道我可以使用“Activator.CreateInstance”,但不确定在这种情况下如何使用。例如,假设我有名为 Calculator1 到 Calculator100 的类,我不确定如何根据 Class name string 在第二行进行转换。

  ObjectHandle handle = Activator.CreateInstance("NameSpaceCalculator", "Calculator1");
  var Calculator = (Calculator1)handle.Unwrap();
4

3 回答 3

1

您可以使用Unwrap()定义了方法的通用接口并将其强制转换为该接口,也可以使用反射来查找Unwrap方法并调用它。

除非您在运行时加载程序集并且不能在其中使用编译时引用的接口,否则我会使用第一个选项,因为在这种情况下反射很慢且过于复杂。

于 2013-08-27T00:50:57.260 回答
1

也许您可以在创建实例时首先获得正确的类型。

public CalculatorBase CreateClass(string typeName)
{
    var type = Type.GetType(string.Format("NameSpaceCalculator.{0}",typeName));
    return (CalculatorBase)Activator.CreateInstance(type);
}
于 2013-08-27T01:06:46.347 回答
1

这对我有用,但接口将是更好的方法:

void Main()
{
    var x = CreateClass("A");
    x.Unwrap();
}

public BaseC CreateClass(string typeName)
{
    var type = Type.GetType(string.Format("MyNamespace.{0}",typeName);
    return (BaseC)Activator.CreateInstance(type);
}


public class A : BaseC
{
    public override void Unwrap()
    {
        Console.WriteLine("A");
    }
}

public class B : BaseC
{
    public override void Unwrap()
    {
        Console.WriteLine("B");
    }
}

public class BaseC
{
    public virtual void Unwrap()
    {
        Console.WriteLine("BaseC");
    }
}


//// Here is the approach with an Interface (note that overrides and virtual declaration needed. 





void Main()
    {
        var x = CreateClass<IBase>("MyNamespace","A");
        x.Unwrap();
    }

    public T CreateClass<T>(string classNamespace, string typeName) where T : class
    {
        var type = Type.GetType(string.Format("{0}.{1}",classNamespace, typeName));
        return (T)Activator.CreateInstance(type);
    }


    public class A : IBase
    {
        public void Unwrap()
        {
            Console.WriteLine("A");
        }
    }

    public class B : IBase
    {
        public void Unwrap()
        {
            Console.WriteLine("B");
        }
    }

    public interface IBase
    {
        void Unwrap();
    }
于 2013-08-27T11:18:48.817 回答