首页 > 解决方案 > 在 C# 中不继承静态方法的解决方法?

问题描述

我有几个派生自抽象类的类。我希望能够根据抽象静态属性的值(比如“maxSpeed”)选择这些派生类之一并创建它的实例。例如,如果我需要的速度是 5,ClassA.maxSpeed 是 2,ClassB.maxSpeed 是 7,客户端代码将创建 Class B 的实例。

C# 不支持静态属性和方法的继承,因此上述方案不起作用。有解决方法吗?

标签: c#inheritancestatic

解决方案


您可以使用自定义属性:

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()

我将由您自己提出您想要的选择逻辑。


推荐阅读