集中程序的操作
本文关键字:操作 程序 集中 | 更新日期: 2023-09-27 17:53:17
我有一个程序,需要从各种形式执行一些操作。我想把这些动作放在一个集中的空间里。每个操作都有自己的类,该类派生自接口。
每个操作只实例化一次,但在不同的地方使用,如上下文菜单,功能区,工具栏等。
我有下面的代码工作,我想摆脱类型in时,使一个列表。我想要强类型,无反射和重构的可能性。
这能做得更有效率吗?
class Program
{
static void Main(string[] args)
{
ActionManager actionManager = new ActionManager();
List<SomeInterface> listA = actionManager.CreateList(typeof(Do_A), typeof(Do_B));
List<SomeInterface> listB = actionManager.CreateList(typeof(Do_A), typeof(Do_B));
}
}
public class ActionManager
{
private Dictionary<Type, SomeInterface> instantiatedActions = new Dictionary<Type, SomeInterface>();
public List<SomeInterface> CreateList(params Type[] actions)
{
List<SomeInterface> theList = new List<SomeInterface>();
foreach (Type type in actions)
{
if(!instantiatedActions.ContainsKey(type))
{
instantiatedActions.Add(type, (SomeInterface)Activator.CreateInstance(type));
}
theList.Add(instantiatedActions[type]);
}
return theList;
}
}
public interface SomeInterface
{
}
public class Do_A : SomeInterface
{
}
public class Do_B : SomeInterface
{
}
public class Do_C : SomeInterface
{
}
如果类型尚未出现,则可以创建返回类型的表达式。这将允许您保留强类型,并强制只允许传入SomeInterface实现。
static void Main(string[] args)
{
ActionManager actionManager = new ActionManager();
List<SomeInterface> listA = actionManager.CreateList<SomeInterface>(
() => new Do_A(), () => new Do_B());
List<SomeInterface> listB = actionManager.CreateList<SomeInterface>(
() => new Do_A(), () => new Do_B());
}
public class ActionManager
{
private Dictionary<Type, SomeInterface> instantiatedActions =
new Dictionary<Type, SomeInterface>();
public List<SomeInterface> CreateList<T>(params Expression<Func<T>>[] actions)
{
List<SomeInterface> theList = new List<SomeInterface>();
foreach (var action in actions)
{
var type = GetObjectType<T>(action);
if(!instantiatedActions.ContainsKey(type))
{
instantiatedActions.Add(type, (SomeInterface)action.Compile().Invoke());
}
theList.Add(instantiatedActions[type]);
}
return theList;
}
private static Type GetObjectType<T>(Expression<Func<T>> expr)
{
if ((expr.Body.NodeType == ExpressionType.Convert) ||
(expr.Body.NodeType == ExpressionType.ConvertChecked))
{
var unary = expr.Body as UnaryExpression;
if (unary != null)
return unary.Operand.Type;
}
return expr.Body.Type;
}
}
需要注意的是,既需要编译表达式来调用它,又需要从表达式树返回类型。但是,根据您的评论,它只在类型尚未被看到的情况下才确保惰性实例化,并保证类型安全。