我需要使用Dot Net的Reflection概念,我对它没有多少专业知识。我会上课和方法名称为字符串,需要在类上调用该方法。
以下是我需要调用方法的类:
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"
}
我尝试了很多这样做但却无法做到。
非常感谢任何帮助。
感谢。
答案 0 :(得分:2)
我假设您知道该类将始终与PerformOperation在同一个程序集中。 如果不是,则需要组件的名称。
您不需要ParentClass,但您确实需要SubClass的全名(包括命名空间)。
我假设你的类总是有一个默认的构造函数,你的方法永远不会有任何参数。
如果以上情况属实,以下情况应该有效:
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);
}
编辑:添加方法来实例化给定类的对象并返回给定字段的值