C# 反射-在指定的类名上动态调用方法

C# 反射-在指定的类名上动态调用方法,c#,.net,reflection,coded-ui-tests,C#,.net,Reflection,Coded Ui Tests,我需要使用点网的反射概念,我在这方面没有太多的专业知识。我将以字符串形式获取类和方法名称,并需要在类上调用该方法 以下是我需要调用方法的类: namespace ObjectRepositories { class Page_MercuryHome : CUITe_BrowserWindow { public new string sWindowTitle = ""; public Page_MercuryHome() {

我需要使用点网的反射概念,我在这方面没有太多的专业知识。我将以字符串形式获取类和方法名称,并需要在类上调用该方法

以下是我需要调用方法的类:

namespace ObjectRepositories
{
    class Page_MercuryHome : CUITe_BrowserWindow
    {
        public new string sWindowTitle = "";
        public Page_MercuryHome()
        {
            #region Search Criteria
            this.SearchProperties[UITestControl.PropertyNames.Name] = "Blank Page";
            this.SearchProperties[UITestControl.PropertyNames.ClassName] = "IEFrame";
            this.WindowTitles.Add("Blank Page");
            this.WindowTitles.Add("Welcome: Mercury Tours");
            #endregion
        }

        public CUITe_HtmlEdit UIEdit_UserName = new CUITe_HtmlEdit("Name=userName");
        public CUITe_HtmlEdit UIEdit_Password = new CUITe_HtmlEdit("Name=password");
        public CUITe_HtmlInputButton UIInputButton_Login = new CUITe_HtmlInputButton("Name=login");
}
}
现在在下面的方法中,我将接收父类名称、子类名称和要调用的方法

例如:

void PerformOperation(string ParentClass, string SubClass, string MethodName)
{
/* Suppose if I receive arguments as "Page_MercuryHome","CUITe_BrowserWindow","SetText")
then it should call SetText() method of subclass CUITe_BrowserWindow which is having Page_MercuryHome as Parent Class"
}
我做了很多,但都做不到

任何帮助都将不胜感激


谢谢。

我假设您知道该类将始终与PerformOperation位于同一程序集中。 如果不是,则需要它所在的程序集的名称

您不需要ParentClass,但需要子类(包括名称空间)的全名

我假设您的类将始终有一个默认构造函数,并且您的方法将永远不会有任何参数

如果上述情况成立,则应采用以下措施:

void PerformOperation(string fullClassName, string methodName)
{
   ObjectHandle handle = Activator.CreateInstance(null, fullClassName);
   Object p = handle.Unwrap();
   Type t = p.GetType();

   MethodInfo method = t.GetMethod(methodName);
   method.Invoke(p, null);
}

object ReadField(string fullClassName, string fieldName)
{
   ObjectHandle handle = Activator.CreateInstance(null, fullClassName);
   Object p = handle.Unwrap();
   Type t = p.GetType();

   FieldInfo field = t.GetField(fieldName);
   return field.GetValue(p);
}

Edit:添加了一个方法来实例化给定类的对象并返回其上给定字段的值

[主题外]:继承术语。。。你搞错了。也许还有一些概念
Page_MercuryHome
是一个派生类(“子类”或“子”类,如您所称),而
CUITe_BrowserWindow
是基类(或“父”类)。在您的代码中,
CUITe_BrowserWindow
是基类,
Page_MercuryHome
是子类。我应该在fullClassName参数中传递什么?“ObjectRepositories.Page_MercuryHome”从您的问题中实例化Page_MercuryHome类谢谢您的回答。它似乎几乎是正确的。但我需要访问对象UIEdit_UserName,它是类CUITe_HtmlEdit的对象。您能相应地修改您的答案吗?使用它如下:var UserName=(CUITe_HtmlEdit)ReadField(”ObjectRepositories.Page_MercuryHome”,“UIEdit_用户名”);