Доступ к свойству объекта в System.Action - PullRequest
0 голосов
/ 05 декабря 2018

Существует два класса:

public abstract class BaseObject
{
    public string Status {get; set;}

    public List<string> StatusHistory {get; set;}

    protected abstract void ExecuteInternal();

    public void Execute()
    {
        this.Status = "Started";

        this.ExecuteInternal();

        this.Status = "Finished";
    }

    // on status changed event: adding current status to StatusHistory list
}

public class SomeObject : BaseObject
{
    public System.Action Action {get; set;}

    public SomeObject() : this(null)
    {
    }

    public SomeObject(System.Action action)
    {
        this.Action = action;
    }

    protected override void ExecuteInternal()
    {
        this.Action();
    }
}

Используя этот объект, я хочу установить свойство Status во времени. Действие будет выполнено:

 const string customStatus = "Custom status";

 var someObject= new SomeObject(() => Status = customStatus);

 someObject.Execute();

, чтобы убедиться, что customStatus был установлендействительно:

 if (!HistoryStatus.Contains(customStatus))
 {
     // throw an exception
 }

Здесь возникает ошибка: имя «Статус» не существует в текущем контексте.

Как я могу установить свойство в действии?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Мне нужно что-то вроде этого:

        const string customStatus = "Custom status";

        var someObject = new SomeObject();

        someObject.Action = () => someObject.Status = customStatus;
0 голосов
/ 05 декабря 2018

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

var someObject = new SomeObject() { Status = customStatus};

Тем не менее, вы можете решить свою текущую проблему, используяSystem.Action<SomeObject>, который указывает ожидаемый тип ввода вместо System.Action, затем измените соответствующие места в вашем коде:

class SomeObject
{
        public System.Action<SomeObject> Action {get; set;}

        public string Status {get; set;}

        public SomeObject() : this(null)
        {
        }

        public SomeObject(System.Action<SomeObject> action)
        {
            this.Action = action;
        }

        public void Execute()
        {
            this.Action(this);
        }
}

Затем выполните следующее:

const string customStatus = "Custom status";
var someObject= new SomeObject((s) => s.Status = customStatus);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...