This is my first question on StackOverflow!
I'm working on a library which defines a simple class like below:
public class Delta<T> : Dictionary<string, object> where T : class, new()
{   
    private PropertyInfo[] properties;
    public Delta() : base()
    {
        properties = typeof(T).GetProperties();
    }
}
The main project (which can be WinForms, ConsoleApp, Web API, MVC) will use this library like that:
public static void main()
{
    var mClass = new Delta<MyClass();
    check(mClass);
}
public class MyClass {
   public string Prop1 { get; set; }
   public string Prop2 { get; set; }
}
private static void check(Delta<MyClass> delta)
{
}
As you can see, the Delta class obtains the properties informations of the T class (MyClass in this case). The methods of Delta class that I have to implement will use only the SetValue and GetValue methods of the PropertyInfo class. This operation (getting the properties of the T class) may be executed many times for the same T class and other classes depending on the number of created instances. For example:
var mycollection = new List<Delta<MyClass>>();
for (int i = 0; i < length; i++)
{
    mycollection.Add(new Delta<MyClass>());
}
var mycollection2 = new List<Delta<MyClass2>>();
for (int i = 0; i < length; i++)
{
    mycollection2.Add(new Delta<MyClass2>());
}
So I added a cache system like this:
internal static class DeltaCache
{
    public static Dictionary<string, PropertyInfo[]> entityProperties = new Dictionary<string, PropertyInfo[]>();
    public static void Add(string key, PropertyInfo[] values)
    {
        entityProperties.Add(key, values);
    }
}
Now, the Delta class check if exists an entry on the entityProperties dictionary before getting the properties from the T type.
public class Delta<T> : Dictionary<string, object> where T : class, new()
{
    private PropertyInfo[] properties;
    public Delta() : base()
    {
        var type = typeof(T);
        if (DeltaCache.entityProperties.ContainsKey(type.FullName))
        {
            properties = DeltaCache.entityProperties[type.FullName];
        }
        else
        {
            properties = type.GetProperties();
        }
    }
}
Now I have two choices:
- If the entity's properties are not cached I add them to the cache;
- On application start (for example in the Application_Startevent of theGlobal.asaxfile for an ASP.NET Website) I find all usages ofDelta<T>and I add the properties of eachTclass to the cache.
The cons of the first point is that the GetProperties method is executed once for class and I have to do some checks. The cons of the second point is (I think) that it may take a little time to get all references to T. However it's only on startup which may not be a problem. Could someone show me how should be the code to implement the second solution?
Also, I have some doubts:
- Should I consider caching the SetValueandGetValuemethods instead of thePropertyInfoobject? (Maybe usingdelegates orActions)
- Are there better methods to optimize this code that I'm not considering?
- Should I worry about the size of the "cache"?
- Based on performance savings, is it worth implementing all this code?
Thank you!
 
Aucun commentaire:
Enregistrer un commentaire