c# – 获取从抽象类继承并在属性中具有特定值的类的实例
发布时间:2020-12-16 01:26:47 所属栏目:百科 来源:网络整理
导读:我正在一家工厂根据两个标准创建具体实例: 1)该类必须从特定的抽象类继承 2)类必须在重写属性中具有特定值 我的代码看起来像这样: public abstract class CommandBase{ public abstract string Prefix { get; }}public class PaintCommand : CommandBase{
我正在一家工厂根据两个标准创建具体实例:
1)该类必须从特定的抽象类继承 2)类必须在重写属性中具有特定值 我的代码看起来像这样: public abstract class CommandBase { public abstract string Prefix { get; } } public class PaintCommand : CommandBase { public override string Prefix { get; } = "P"; } public class WalkCommand : CommandBase { public override string Prefix { get; } = "W"; } class Program { static void Main(string[] args) { var paintCommand = GetInstance("P"); var walkCommand = GetInstance("W"); Console.ReadKey(); } static CommandBase GetInstance(string prefix) { try { var currentAssembly = Assembly.GetExecutingAssembly(); var concreteType = currentAssembly.GetTypes().Where(t => t.IsSubclassOf(typeof(CommandBase)) && !t.IsAbstract && t.GetProperty("Prefix").GetValue(t).ToString() == prefix).SingleOrDefault(); if (concreteType == null) throw new InvalidCastException($"No concrete type found for command: {prefix}"); return (CommandBase)Activator.CreateInstance(concreteType); } catch (Exception ex) { return default(CommandBase); } } } 我收到错误:
解决方法
更简洁的方法是定义自己的属性来存储前缀.
[AttributeUsage(AttributeTargets.Class)] public class CommandAttribute : Attribute { public String Prefix { get; set; } public CommandAttribute(string commandPrefix) { Prefix = commandPrefix; } } 然后像这样使用它们: [CommandAttribute("P")] public class PaintCommand : CommandBase {} [CommandAttribute("W")] public class WalkCommand : CommandBase {} 反思: static CommandBase GetInstance(string prefix) { var currentAssembly = Assembly.GetExecutingAssembly(); var concreteType = currentAssembly.GetTypes().Where(commandClass => commandClass.IsDefined(typeof(CommandAttribute),false) && commandClass.GetCustomAttribute<CommandAttribute>().Prefix == prefix).FirstOrDefault(); if (concreteType == null) throw new InvalidCastException($"No concrete type found for command: {prefix}"); return (CommandBase)Activator.CreateInstance(concreteType); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |