public static Type GetDefaultTracker(Type trackableType)
{
// ITrackablePoco -> TrackablePocoTracker
var pocoType = TrackableResolver.GetPocoType(trackableType);
if (pocoType != null)
{
return(typeof(TrackablePocoTracker <>).MakeGenericType(pocoType));
}
// ITrackableContainer -> TrackableContainerTracker
var containerType = TrackableResolver.GetContainerType(trackableType);
if (containerType != null)
{
var trackerTypeName = containerType.Namespace + "." +
"Trackable" + containerType.Name.Substring(1) + "Tracker";
return(containerType?.Assembly.GetType(trackerTypeName));
}
// TrackableDictionary -> TrackableDictionaryTracker
// TrackableSet -> TrackableSetTracker
// TrackableList -> TrackableListTracker
if (trackableType.IsGenericType)
{
var genericType = trackableType.GetGenericTypeDefinition();
if (genericType == typeof(TrackableDictionary <,>))
{
return(typeof(TrackableDictionaryTracker <,>).MakeGenericType(
trackableType.GetGenericArguments()));
}
if (genericType == typeof(TrackableSet <>))
{
return(typeof(TrackableSetTracker <>).MakeGenericType(
trackableType.GetGenericArguments()));
}
if (genericType == typeof(TrackableList <>))
{
return(typeof(TrackableListTracker <>).MakeGenericType(
trackableType.GetGenericArguments()));
}
}
return(null);
}