我正在为Windows CE设备开发ORM。我需要将属性的getter / setter方法缓存为委托,并在需要时调用它们以获得最佳性能。
假设我有2个像这样定义的实体:
public class Car
{
public string Model { get; set; }
public int HP { get; set; }
}
public class Driver
{
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
我需要能够为每个实体的每个属性保留2个代表。所以我创建一个AccessorDelegates类来为每个属性保存2个委托:
public class AccessorDelegates<T>
{
public Action<T, object> Setter;
public Func<T, object> Getter;
public AccessorDelegates(PropertyInfo propertyInfo)
{
MethodInfo getMethod = propertyInfo.GetGetMethod();
MethodInfo setMethod = propertyInfo.GetSetMethod();
Setter = BuildSetter(setMethod, propertyInfo); // These methods are helpers
Getter = BuildGetter(getMethod, propertyInfo); // Can be ignored
}
}
现在我想将特定实体类型的每个AccessorDelegates添加到列表中。所以我定义了一个类:
public class EntityProperties<T>
{
public List<AccessorDelegates<T>> Properties { get; set; }
}
我需要为每个实体类型保留这些EntityProperties,在我的示例Car and Driver中。为了简单起见,我创建了一个代表实体名称的Dictionary<string, EntityProperties<T>>
字符串:
public class Repo<T>
{
public Dictionary<string, EntityProperties<T>> EntityPropDict { get; set; }
}
这是我无法找到解决问题的方法。我想为每个实体类型保留EntityProperties
但我必须为Repo<T>
类提供一个类型参数才能创建字典(因为EntityProperties<T>
需要类型参数)。
我需要能够在没有Repo
类型参数的情况下创建它。如何在不给我的Repo类提供类型参数的情况下定义Dictionary<string, EntityProperties<T>>
?< / p>
答案 0 :(得分:0)
我已经找到了一个解决方案,一个小巧的智能代码,但工作正常。
我添加了一个由AccessorDelegates实现的接口:
public interface IAccessorDelegates
{
void Init(PropertyInfo propertyInfo);
}
我将PropertyMetadata更改为包含IAccessorDelegate而不是AccessorDelegate:
public class PropertyMetadata
{
public PropMapAttribute Attribute { get; set; }
public PropertyInfo PropertyInfo { get; set; }
public IAccessorDelegates AccessorDelegates { get; set; }
public PropertyMetadata()
{
}
public PropertyMetadata(PropMapAttribute attribute, PropertyInfo propertyInfo, IAccessorDelegates delegates)
{
Attribute = attribute;
PropertyInfo = propertyInfo;
AccessorDelegates = delegates;
}
public AccessorDelegates<T> GetAccesssorDelegates<T>()
{
return (AccessorDelegates<T>)AccessorDelegates;
}
}
现在,我可以用这种方式创建和初始化AccessorDelegate:
Type accesssorType = typeof(AccessorDelegates<>);
Type genericAccessorType = accesssorType.MakeGenericType(type);
IAccessorDelegates accessor = (IAccessorDelegates)Activator.CreateInstance(genericAccessorType);
accessor.Init(propertyInfo);
PropertyMetadata.GetAccessorDelegates<T>()
方法可让我以实际的AccessorDelegate<T>
类型投射和获取对象。