反射调用方法

时间:2014-06-20 17:35:19

标签: c# generics reflection abstract

我有以下C#代码。 Base类和从该基类继承的类。 我在一个特殊的List中使用这个Baseclasses。此List还有成员ReadListAsXmlAs。

public class ResultSetBase
{
   some Members
}

public class ResultSetBaseSweep : ResultSetBase
{
   some other Members
}

public class ResultList<T> where T : ResultSetBase
{
    public ResultList<T> ReadListAsXmlAs(params string[] path)
    {
      ...
    }
}

在另一个方法中,我想创建Type ResultList的动态对象。我知道ResultList是哪个类,仅在运行时。 (例如ResulstSetBaseSweep,或从ResultSetBase继承的任何其他内容)。

我创建了这种类型的动态对象。以下方式。

Type myType = Type.GetType("Class in String Format");
Type listtype = typeof(ResultSaver.ResultList<>).MakeGenericType(myType);

object resultlist = Activator.CreateInstance(listtype);

现在我需要调用Methode ReadListAsXmlAs。由于它是object类型,编译器会在我尝试调用

时抱怨
resultlist.ReadListAsXmlAs(...);

所以我试着把它叫做反思:

myType.InvokeMember("ReadListAsXmlAs", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, resultlist, new object[] { filenames.ToArray() });

然后我收到编译器错误:找不到ReadListAsXmlAs!怎么做对了?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法:

Type myType = Type.GetType(LstBoxClass.SelectedItem.ToString());
Type listtype = typeof(ResultSaver.ResultList<>).MakeGenericType(myType);

object resultlist = Activator.CreateInstance(listtype);

MethodInfo method = listtype.GetMethod("ReadListAsXmlAs");
method.Invoke(resultlist, new Object[] {filenames.ToArray()});