在.NET Compact Framework中缓存属性Getter / Setter

时间:2013-01-25 14:30:44

标签: generics orm compact-framework windows-ce

我正在为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>

1 个答案:

答案 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>类型投射和获取对象。