请问关于c的具体应用场景有哪些?

2026-04-29 03:462阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计446个文字,预计阅读时间需要2分钟。

请问关于c的具体应用场景有哪些?

我在一家工厂根据两个标准创建了一个抽象类实例:

1.该类必须从特定的抽象类继承。

2.类必须在重写属性时包含特定值。

我的代码看起来像这样:javapublic abstract class CommandBase { public abstract String 属性;}

我正在一家工厂根据两个标准创建具体实例:

1)该类必须从特定的抽象类继承

请问关于c的具体应用场景有哪些?

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); } } }

我收到错误:

{System.Reflection.TargetException: Object does not match target type. at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)

更简洁的方法是定义自己的属性来存储前缀.

[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); }

本文共计446个文字,预计阅读时间需要2分钟。

请问关于c的具体应用场景有哪些?

我在一家工厂根据两个标准创建了一个抽象类实例:

1.该类必须从特定的抽象类继承。

2.类必须在重写属性时包含特定值。

我的代码看起来像这样:javapublic abstract class CommandBase { public abstract String 属性;}

我正在一家工厂根据两个标准创建具体实例:

1)该类必须从特定的抽象类继承

请问关于c的具体应用场景有哪些?

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); } } }

我收到错误:

{System.Reflection.TargetException: Object does not match target type. at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)

更简洁的方法是定义自己的属性来存储前缀.

[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); }