C# свойства делегата - PullRequest
       1

C# свойства делегата

0 голосов
/ 01 апреля 2020

Можно ли передать свойство в качестве делегата в c#?

Я знаю, что в C# мы можем передавать функции в качестве аргументов метода, но у меня есть свойство, которое в моей ситуации мало чем отличается от функции, которая не принимает параметров, как я могу передать ее в качестве аргумента?

public IWebElement Name => _element.FindElements(By.ClassName("field-key"))[0].FindElements(By.TagName("label"))[0];

Я работаю с селеном и меняю элементы. Вот почему моя собственность Name такая, какая она есть. Поэтому я всегда получаю последнее имя, когда делаю что-то вроде: MultinationalPage.GeneralPanel.DefinitionField.Name.

. В моем тесте, чтобы не получить эталонное исключение для устаревшего элемента, я использую Thread.Sleep(), но я знаю, что есть более эффективные способы теперь это мой подход.

Thread.Sleep(5000)

multinational.EditModal.StateTracker.VerifyChanges(_multinational.GeneralPanel.DefinitionField.Name);

Я бы хотел сделать Thread.Sleep(5000) внутри VerifyChanges(), поэтому я хочу передать свойство Name в качестве делегата VerifyChanges(MultinationalPage.GeneralPanel.DefinitionField.Name).

Примерно так:

public void VerifyChanges(Func<IWebElement> Name) 
{
    Thread.Sleep(5000)
    var name = Name;
    ...
}

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Я думаю, что есть лучший способ решить эту проблему.

Создать интерфейс:

interface IHasName
{
    IWebElement Name { get; }
}

Реализация:

class YourClass : IHasName
{
    public IWebElement Name
        => _element.FindElements(By.ClassName("field-key"))[0].FindElements(By.TagName("label"))[0];
}

Тогда ваш метод:

public void VerifyChanges(IHasName hasName) 
{
    Thread.Sleep(5000)
    var name = hasName.Name;
    ...
}
1 голос
/ 01 апреля 2020

Решение заключается в инкапсуляции доступа к свойству в лямбда-выражении:


multinational.EditModal.StateTracker.VerifyChanges(
    () => _multinational.GeneralPanel.DefinitionField.Name
);
0 голосов
/ 01 апреля 2020

Если вы сможете поделиться своим полным кодом, мы сможем лучше понять проблему, которую вы пытаетесь решить. Передача свойства аналогична передаче значения параметра в функцию. например, давайте предположим, что ваша функция выглядит как

public void MyFunction(IWebElement webElement)
{
  // Your code goes here.
}

Вы можете вызвать эту функцию и передать свойство следующим образом:

MyClass obj = new MyClass();
MyFunction(obj.Name);

Я предположил, что MyClass - это имя класса, который имеет это свойство.

======== Отредактировано В вашем случае вы можете обернуть свой код внутри Fun c следующим образом

 public void VerifyChanges(() => multinational.GeneralPanel.DefinitionField.Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...