Add CanInvoke method to IResourceAction.

This commit is contained in:
2023-12-20 00:06:57 +08:00
parent e1bb874943
commit c66b7da63b
7 changed files with 36 additions and 11 deletions

View File

@@ -45,17 +45,21 @@ namespace Cryville.Crtr.Browsing.Actions {
Unregister(typeof(T), action);
}
public IEnumerable<IResourceAction> GetActions(Type type) {
public IEnumerable<IResourceAction> GetActions(Uri uri, IResourceMeta res) {
return GetActions(uri, res, res.GetType());
}
IEnumerable<IResourceAction> GetActions(Uri uri, IResourceMeta res, Type type) {
if (type == null) return Enumerable.Empty<IResourceAction>();
List<IResourceAction> actions;
if (!_actions.TryGetValue(type, out actions)) {
actions = new List<IResourceAction>();
}
IEnumerable<IResourceAction> result = actions;
IEnumerable<IResourceAction> result;
if (_actions.TryGetValue(type, out actions))
result = actions.Where(i => i.CanInvoke(uri, res));
else
result = Enumerable.Empty<IResourceAction>();
if (type != typeof(object))
result = result
.Concat(GetActions(type.BaseType))
.Concat(type.GetInterfaces().SelectMany(i => GetActions(i)));
.Concat(GetActions(uri, res, type.BaseType))
.Concat(type.GetInterfaces().SelectMany(i => GetActions(uri, res, i)));
return result;
}
}