**Circular dependency between classes
I've tried something this works well, it needs to be checked whether it's correct or if anyone can help me with it.**
public static class EntitySerializerHelper
{
private const byte MaxNumberStackTraceFrameCount = 100;
public static void HasCircularDependency(this Type entityObjectType)
{
CheckStackDepth();
var publicProperties = entityObjectType.GetProperties()
.Where(o => o.PropertyType.IsPublic && !o.PropertyType.IsValueType && o.PropertyType != typeof(string)).ToArray();
foreach (var propertyInfo in publicProperties)
{
var typeOfObject = propertyInfo.PropertyType;
if (typeOfObject.IsGenericType)
{
if (HasTypeDictionary(typeOfObject))
{
var keyType = typeOfObject.GetGenericArguments()[0];
var valueType = typeOfObject.GetGenericArguments()[1];
HasCircularDependency(keyType);
HasCircularDependency(valueType);
}
else if (HasEnumerableType(typeOfObject))
{
var itemType = typeOfObject.GetGenericArguments().Single();
HasCircularDependency(itemType);
}
}
else if (typeOfObject.IsClass)
{
HasCircularDependency(typeOfObject);
}
}
}
static void CheckStackDepth()
{
if (new StackTrace().FrameCount > MaxNumberStackTraceFrameCount)
{
throw new StackOverflowException("StackOverflow");
}
}
static bool HasEnumerableType(Type type)
{
if (type.IsInterface && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
{
return true;
}
foreach (var intType in type.GetInterfaces())
{
if (intType.IsGenericType && intType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
{
return true;
}
}
return false;
}
static bool HasTypeDictionary(Type typeOfObject)
{
return typeOfObject.GetGenericTypeDefinition() == typeof(Dictionary<,>);
}
}