0

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

在我的示例 Car 和 Driver 中,我需要为每个实体类型保存这些 EntityProperties。为了简单起见,我创建了一个Dictionary<string, EntityProperties<T>>表示实体名称的字符串:

public class Repo<T>
{
    public Dictionary<string, EntityProperties<T>> EntityPropDict { get; set; }
}

这是我无法找到解决问题的地方。我想EntityProperties为每个实体类型保留,但我必须给Repo<T>类一个类型参数才能创建字典(因为EntityProperties<T>需要一个类型参数)。

我需要能够在没有类型参数的情况下创建它Repo如何在Dictionary<string, EntityProperties<T>>不给我的 Repo 类一个类型参数的情况下定义一个?

4

1 回答 1

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>类型的对象。

于 2013-01-30T11:57:38.650 回答