【问题标题】:Creating Object from Class name specified in string从字符串中指定的类名创建对象
【发布时间】:2013-08-18 06:08:10
【问题描述】:

我在网页上有一个下拉列表,其中包含所有类名的列表,在 C# 代码中,我需要从下拉列表中实例化所选项目的对象并调用它的方法。所有类都有类似的方法。

 String sCalclationType = "N0059";
 var Calculator = Activator.CreateInstance("Calculator", sCalclationType ); 
 var count =  Calculator.DoCalculation();

我尝试转换显示“无法将类型'System.Runtime.Remoting.ObjectHandle'转换为'CypressDataImport.DiabetesHelper.NQF0059”,我还需要转换为需要与下拉项相同的类型,所以不知道如何这样做。

//var calc = (N0059)Calculator; 

我该如何处理这种情况?

【问题讨论】:

    标签: c# class object casting


    【解决方案1】:

    看这里:

    试试这个:

    String sCalclationType = "N0059";
    ObjectHandle handle = Activator.CreateInstance("Calculator", sCalclationType ); 
    var Calculator = (N0059)handle.Unwrap();
    var count = Calculator.DoCalculation();
    

    或

    String sCalclationType = "N0059";
    ObjectHandle handle = Activator.CreateInstance("Calculator", sCalclationType );
    Object p = handle.Unwrap();
    Type t = p.GetType();
    MethodInfo method = t.GetMethod("DoCalculation");
    var count = method.Invoke(p, null); 
    

    【讨论】:

    • 在第一种方法中,您正在执行 (N0059) 强制转换,但我们不知道类的类型。我认为第二种方法可以正常工作。是否可以通过从某个主类继承所有类来使用第一种方法?
    • 是的。创建一个包含所有计算器应具有的基类...我猜在您的情况下是 DoCalculation ....我猜是添加术语的方法。
    【解决方案2】:

    您需要返回Activator.CreateInstace()方法返回的包装对象。

    要做到这一点,请查看ObjectHandle.Unwrap on MSDN。

    还请确保您使用类型的完全限定名称,如 here 所述。

    以下是使用示例:

    Object obj = Activator.CreateInstance(System.Reflection.Assembly.GetExecutingAssembly().FullName, "CypressDataImport.DiabetesHelper.NQF0059.N0059").Unwrap();
    N0059 calculator= (N0059)obj;
    

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 2017-05-02
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2015-09-08
      相关资源
      最近更新 更多