Silverlight - 如何使用Action <t> Delegate作为方法参数</t>

时间:2010-02-23 01:42:36

标签: silverlight

在渲染任何页面之前,我想要加载一堆元数据(页面内容取决于元数据)。查看App.xaml.cs中的Application_Startup方法我可以看到有代码行

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

这看起来正是我想要的(定义是:

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

此操作在操作完成时调用“Action”。如何为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 个答案:

答案 0 :(得分:1)

好的,所以Action只是一个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"));