using System; namespace Cryville.Crtr.Browsing.Actions { public abstract class ResourceAction : IResourceAction where T : IResourceMeta { public abstract string Name { get; } public abstract int Priority { get; } public abstract bool CanInvoke(Uri uri, T resource); public bool CanInvoke(Uri uri, IResourceMeta resource) { if (resource == null) throw new ArgumentNullException("resource"); if (resource is not T res) throw new ArgumentException("Mismatched resource type."); return CanInvoke(uri, res); } public abstract void Invoke(Uri uri, T resource); public void Invoke(Uri uri, IResourceMeta resource) { if (resource == null) throw new ArgumentNullException("resource"); if (resource is not T res) throw new ArgumentException("Mismatched resource type."); Invoke(uri, res); } } }