Silverlight - Как использовать делегат Action <T>в качестве параметра метода - PullRequest
1 голос
/ 23 февраля 2010

У меня есть куча метаданных, которые я хочу загрузить, прежде чем рендерить какие-либо страницы (содержимое страницы зависит от метаданных) Глядя на метод Application_Startup в App.xaml.cs, я вижу, что есть строка кода

WebContext.Current.Authentication.LoadUser(this.Application_UserLoaded, null);

Это выглядит именно то, что я хочу (определение:

public LoadUserOperation LoadUser(Action<LoadUserOperation> completeAction, object userState);

Этот метод вызывает «Действие» после завершения операции. Как я могу реализовать аналогичный подход для моего метода LoadMetaData ()?

MetaDataClass

public static class MetaData 
    {
        private static bool _modelEntitiesIsLoading; 
        private static TTASDomainContext _ttasContext;       

        static MetaData()
        {
            Initialize();            
        }

        private static void Initialize()
        {
            _ttasContext = new TTASDomainContext();

        }
public static void LoadData()
        {
            //Exit if currently loading, or there is no context
            if (_modelEntitiesIsLoading || _ttasContext == null)
            {
                return;
            }

            _modelEntitiesIsLoading = true;

            _ttasContext.ModelEntities.Clear();
            var q = _ttasContext.GetModelEntityQuery();
            _ttasContext.Load(_ttasContext.GetModelEntityQuery(), OnModelEntitiesLoaded, null);
        }

private static void OnModelEntitiesLoaded(LoadOperation<ModelEntity> loadOperation)
        {
            if (loadOperation.Error != null)
            {
                //raise an event... 

            }
            else
            {
                ModelEntities = loadOperation;


                _modelEntitiesIsLoading = false;                

            }

1 Ответ

1 голос
/ 23 февраля 2010

ОК, поэтому действие - это просто сокращение для метода void, принимающего один параметр типа T. Он определяется как:

public delegate void Action<T>(T obj);

Таким образом, когда вы определяете функцию, принимающую Action в качестве параметра, вы можете просто вызвать ее, как если бы она была делегатом:

public void LoadMetaData (Action<MetaDataOperation> callback) {
 //method implementation
 callback(new MetaDataOperation());
}

В приведенном выше сценарии MetaDataOperation может быть любого типа, который вы хотите.

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

РЕДАКТИРОВАТЬ Верно, поэтому MetaDataOperation в данном случае - это какой-то параметр, который вы хотите передать из метода LoadMetaData после его завершения. Это полностью зависит от вас, что в нем. Если вам это на самом деле не нужно, вы можете не иметь его так:

public void LoadMetaData (Action callback) {
 //method implementation
 callback();
}  


//Use of LoadMetaData 

public static void OnMetaDataFinished() {
  System.Diagnostics.Debug.Trace("Finished loading metadata");
}
WhateverClass.LoadMetaData(OnMetaDataFinished);

//OR lambda version
WhateverClass.LoadMetaData(()=>System.Diagnostics.Debug.Trace("Finished loading metadata"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...