如何在 List<BaseClass> 上使用泛型多态性,该 List<BaseClass> 包含我的特定代码设计的基类的任何子项?

问题描述

上下文

我有一个抽象父类 Register 和两个接口,它们分别需要实现通用委托 Func<T>Action<T>

public abstract class Register
{
    public int Address { get; protected set; }
    public string ID { get; protected set; }

    public abstract Type targettype { get; }
    public abstract bool TargetIsArray { get; }
}

public interface IReadableRegister<T>
{
    Func<T> GetAccessor { get; }
}

public interface IWritableRegister<T>
{
    Action<T> SetAccessor { get; }
}

这些用于定义许多子类,例如:

public class FooRegister<T> : Register,IReadableRegister<T>
{
    public override Type targettype => typeof(T);
    public override bool TargetIsArray => targettype.IsArray;
    public Func<T> GetAccessor { get; }
    // Further unique members

    public FooRegister(int address,object target,PropertyInfo targetProperty)
    {
        this.Address = address;
        this.ID = targetProperty.Name;
        this.GetAccessor = (Func<T>)targetProperty.getmethod.CreateDelegate(typeof(Func<T>),target);
    }
}

public class BarRegister<T> : Register,IWritableRegister<T>
{
    public override Type targettype => typeof(T);
    public override bool TargetIsArray => targettype.IsArray;
    public Action<T> SetAccessor { get; }
    // Further unique members

    public BarRegister(int address,PropertyInfo targetProperty)
    {
        this.Address = address;
        this.ID = targetProperty.Name;
        this.SetAccessor = (Action<T>)targetProperty.SetMethod.CreateDelegate(typeof(Action<T>),target);
    }
}

用法

使用反射,我构建了一个 List<Register>,它最终为目标对象的公共属性提供了一个集合 Get/Set 委托(通过一个与这个问题无关的标准)。我希望能够通过 List<Register>(很容易完成)将此 ID 编入索引,以便根据需要调用 GetAccessor 和/或 SetAccessor

问题

到目前为止,我未能处理从 List<Register> 返回的元素作为它添加时的特定泛型类型,因为任何强制转换都要求我使用变量 Register.targettype 并且泛型必须在编译时间。

问题

我知道该问题的可能解决方案,例如此处详述的 Setting generic type at runtime 以及 dynamic 用法,但是我觉得我的方法存在根本性缺陷。还可以如何实现此功能?肯定会定期处理具有多态类型的泛型吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)