微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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 举报,一经查实,本站将立刻删除。