在渲染任何页面之前,我想要加载一堆元数据(页面内容取决于元数据)。查看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;
}
答案 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"));