c# - 在 C# 中不继承静态方法的解决方法?
问题描述
我有几个派生自抽象类的类。我希望能够根据抽象静态属性的值(比如“maxSpeed”)选择这些派生类之一并创建它的实例。例如,如果我需要的速度是 5,ClassA.maxSpeed 是 2,ClassB.maxSpeed 是 7,客户端代码将创建 Class B 的实例。
C# 不支持静态属性和方法的继承,因此上述方案不起作用。有解决方法吗?
解决方案
您可以使用自定义属性:
using System;
using System.Linq;
using System.Reflection;
namespace ConsoleApp10
{
abstract class Abstract {}
[MaxSpeed(10)]
class ClassA : Abstract {}
[MaxSpeed(20)]
class ClassB : Abstract {}
internal class MaxSpeedAttribute : Attribute
{
public int MaxSpeed { get; }
public MaxSpeedAttribute(int maxSpeed)
{
MaxSpeed = maxSpeed;
}
}
class Program
{
static void Main(string[] args)
{
var candidates = Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => t.IsSubclassOf(typeof(Abstract)))
.Select(t => (type: t, maxSpeedAtt: t.GetCustomAttribute<MaxSpeedAttribute>()))
.Where(t => t.maxSpeedAtt != null);
var candidate = candidates.FirstOrDefault(c => c.maxSpeedAtt.MaxSpeed > 4);
var myClass = (Abstract)Activator.CreateInstance(candidate.type);
}
}
}
注意如果类没有无参数构造函数,这将失败。Abstract
如果没有扩展的类声明该属性,它也会失败。
还要记住,如果您的课程在其他程序集中,您将需要扫描这些程序而不是Assembly.GetExecutingAssembly().GetTypes()
我将由您自己提出您想要的选择逻辑。
推荐阅读
- python - 抓取:从 pandas 中恢复 gleif 信息
- datetime - SAS 将字符串转换为 datetime18
- flutter - DropDownButton 不显示我选择的选项
- tuples - Apache Storm 2.2.0 UI:不发出也不传输元组
- java - 如何将多个图像文件作为 Spring-Boot 和 Angular 应用程序的 Spring-boot 响应数据发送?
- python - Google Cloud Composer 在失败时调用 API
- c# - 如何在bot框架中自定义英雄卡
- node.js - NodeJS 中间件 GCS 视频流在加载时挂起
- c# - aws codebuild dotnet:5.0 - 没有可用的 sdk 命令
- sql - SQL 我如何命名表以便以后引用它们?