2017-06-26 4 views
1

Ich habe die Notwendigkeit, Instanz einer Seite dynamisch (mit Selen) zur Laufzeit zu erstellen. Die Idee ist, den Klassennamen aus einer Zeichenfolge abzurufen und zu initialisieren.Wie initialisiert man eine geerbte Klasse aus String in C#?

Lasst uns sagen, dass ich ein „GenericPage“ haben:

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

Die zweite Klasse vererben GenericPage

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); 
    } 
} 

es also hier gehen die Umsetzung ist das, was ich versucht habe, WhatIsYourNamePage dynamisch zu erstellen:

Problem ist, dass auf diese Weise ruft GenericPage.Proceed, aber ich möchte WhatIsYourNamePage.Proceed.

Natürlich kann ich ändern:

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

Aber ich brauche diese aus einem String dynamisch zu tun. Wie?

+0

Lesen Sie hier: https://stackoverflow.com/questions/159978/c-sharp-keyword-usage-virtualoverride-vs-new – kiziu

Antwort

1

Angenommen, Sie sollten die Methode Proceed als virtuell deklarieren. Verwenden Sie das Schlüsselwort new nicht, um die Methode in der geerbten Klasse zu überschreiben (es sei denn, Sie wissen wirklich, was Sie tun, da sie die Methode nicht überschreibt (OOP-Polymorphismus), aber sie ausblendet). Also nur override es mit Schlüsselwort überschreiben. Wenn Sie es auf diese Weise tun, wird die myObject.Proceed("LogInTest"); in der geerbten Klasse ohne weiteren Code geändert werden.

Etwas wie folgt aus:

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

Obwohl die Arbeit mit „neuen“ Methoden Methoden mit dem gleichen Namen von einer Basisklasse versteckt immer schwierig ist, können Sie Ihr Problem lösen, indem Sie die Methode wie folgt aufrufen:

type.GetMethod("Proceed").Invoke(myObject, new[] { "LogInTest" }); 
Verwandte Themen