2017-06-26 6 views
1

私は実行時に(セレンを使用して)ページのインスタンスを動的に作成する必要があります。そのアイデアは、文字列からクラス名を取り出して初期化することです。C#で文字列から継承したクラスを初期化する方法は?

のは、私が「GenericPage」を持っているとしましょう:

public class GenericPage 
    { 
     public void Proceed(string testName) 
     { 
     //Basic implementation 
     } 
    } 

public class WhatIsYourNamePage : GenericPage 
{ 
    [FindsBy(How = How.Id, Using = "fieldName")] 
    [CacheLookup] 
    private IWebElement UserName { get; set; } 

    [FindsBy(How = How.Id, Using = "fieldSurname")] 
    [CacheLookup] 
    private IWebElement UserSurname { get; set; } 

    [FindsBy(How = How.Id, Using = "submit-first-inner-1")] 
    [CacheLookup] 
    private IWebElement Submit { get; set; } 

    new public void Proceed(string testName) 
    { 
     var userData = ExcelDataAccess.GetTestData(testName); 
     UserName.EnterText(userData.fieldName, Costants.UserNameElementName); 
     UserSurname.EnterText(userData.fieldSurname, Costants.SurnameElementName); 
     Thread.Sleep(5000); 
     Submit.ClickOnIt(Costants.SubmitButtonElementName); 
     Thread.Sleep(5000); 
    } 
} 

を進んで実装GenericPageから2番目のクラスを継承だから、ここでそれは私が動的にWhatIsYourNamePageを作成しようとしたものである。

var type = Type.GetType("WhatIsYourNamePage"); 
var myObject = (GenericPage)Activator.CreateInstance(type); 
myObject.Proceed("LogInTest"); 

このように、GenericPage.Proceedを呼び出すと、しかし私はWhatIsYourNamePage.Proceedが欲しいです。

はもちろん、私は変更することができます。

var myObject = (WhatIsYourNamePage)Activator.CreateInstance(type); 

しかし、私は、文字列から動的にこれを実行する必要があります。どうやって?

+0

ここにお読みください:https://stackoverflow.com/questions/159978/c-sharp-keyword-usage-virtualoverride-vs-new – kiziu

答えて

1

Proceedメソッドを仮想として宣言する必要があるとします。 newキーワードを使用して継承したクラスのメソッドをオーバーライドしないでください(メソッドをオーバーライドしない(OOPポリモフィズム)が隠されているため実際に何をしているのか分かりません)。だからちょうどoverrideそれはキーワードを上書きします。このようにすれば、myObject.Proceed("LogInTest");はコードを変更せずに継承したクラスで呼び出されます。

このような何か:

public class GenericPage 
{ 
    public virtual void Proceed(string testName) 
    { 
    //Basic implementation 
    } 
} 

public class WhatIsYourNamePage : GenericPage 
{ 
    [FindsBy(How = How.Id, Using = "fieldName")] 
    [CacheLookup] 
    private IWebElement UserName { get; set; } 

    [FindsBy(How = How.Id, Using = "fieldSurname")] 
    [CacheLookup] 
    private IWebElement UserSurname { get; set; } 

    [FindsBy(How = How.Id, Using = "submit-first-inner-1")] 
    [CacheLookup] 
    private IWebElement Submit { get; set; } 

    public override void Proceed(string testName) 
    { 
     var userData = ExcelDataAccess.GetTestData(testName); 
     UserName.EnterText(userData.fieldName, Costants.UserNameElementName); 
     UserSurname.EnterText(userData.fieldSurname, Costants.SurnameElementName); 
     Thread.Sleep(5000); 
     Submit.ClickOnIt(Costants.SubmitButtonElementName); 
     Thread.Sleep(5000); 
    } 
} 
0

基本クラスから同じ名前のメソッドを隠して「新しい」方法での作業は常にトリッキーですが、あなたはこのようなメソッドを呼び出すことで、あなたの問題を解決することができます:

type.GetMethod("Proceed").Invoke(myObject, new[] { "LogInTest" }); 
関連する問題