private void internal_RegistDynamicProperty(Name propertyName, string description, MethodInfo surogate, DynamicPropertyCalculator converted)
{
if (!propertyName.IsPrimitive)
throw new ArgumentException("The property name must be a primitive symbol.", nameof(propertyName));
var p = surogate.GetParameters();
var propertyParameters = p.Skip(1).Select(p2 => (Name) $"[{p2.Name}]").ToArray();
var template = Name.BuildName(propertyParameters.Prepend(propertyName));
var r = m_dynamicProperties.Unify(template).FirstOrDefault();
if (r != null)
throw new ArgumentException($"There is already a registed property with the name {propertyName} that receives {p.Length - 3} parameters.");
if (m_knowledgeStorage.Unify(template).Any())
throw new ArgumentException($"There are already stored property values that will collide with the given dynamic property.");
m_dynamicProperties.Add(template, new DynamicKnowledgeEntry(converted,propertyParameters, description));
}