在c#中使用methodinfo调用泛型参数化方法

时间:2017-10-13 07:17:17

标签: c#

我有一个类,我尝试在Avtivator.CreateInstance的帮助下创建,因为我在运行时将类名称作为字符串获取。所以,在那个类中,我有一个方法有一个List类型的参数,现在我的问题是如何使用MethodInfo调用这种类型的方法。 e.g。

Class XHospital{

    private string HospitalName;
    private IList<string> docList;
    public void SetDoctorList(List<string> docList){

        this.docList = docList;
       // some other code snippet here after getting docList
    }
    // .... rest of the code
}

现在创建Hospital类和调用方法

public void SetHospitalDetails(string hospitalName, string methodName){

    Type NewType = Type.GetType(hospitalName);
    Object NewClass = Activator.CreateInstance(NewClass, new object[]{});
    MethodInfo method = NewType.GetMethod(methodName);
    IList<string> docs = new List<string>(){ "doc1", "doc2" };
    method.Invoke(NewClass, new object[] { docs });//-------------  here i am 
       //  getting exception stating ...
       /*   Object of type 'System.Collections.Generic.List`1[System.Object]' 
            cannot be converted to type 
            'System.Collections.Generic.List`1[System.String]' */
}

请帮助我做错了... 注意:我不允许在XHospital类中进行任何更改。所以我不能自己处理它。*** 提前谢谢。

2 个答案:

答案 0 :(得分:0)

来自documentation

  

调用的方法或构造函数的参数列表。这是一个对象数组,其数量,顺序和类型与要调用的方法或构造函数的参数相同。

如果你需要传入确切的具体类型(IList<String>),那么修复就是不要让你的变量更抽象(List<String>)。所以试试这个:

 List<string> docs = new List<string>(){ "doc1", "doc2" };
 method.Invoke(NewClass, new object[]{docs} );

答案 1 :(得分:0)

您的代码是正确的,除了: Object NewClass = Activator.CreateInstance(NewClass,new object [] {}); 它应该是 Object NewClass = Activator.CreateInstance(NewType,new object [] {});

效果很好。 如果仍有问题,请尝试直接设置字段值。 field.SetValue(NewClass,any);