问题描述
上下文
我有一个抽象父类 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 (将#修改为@)