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