Member 8025807 Ответов: 0

Создание рекурсивной функции в языке Си#


Привет,

Пожалуйста, помогите. Мне нужна функция, которая будет содержать объект класса, и она вернет словарь в виде пары ключ-значение, где ключ будет именем свойства, а значение-значениями свойства. это означает :- DictionaryObject<classname.propertyname, property value>. Это легко возможно с помощью отражения. Но дело в том ,что может существовать вложенный уровень свойств различных типов,таких как int,string, collection, property as collection, property as class type.

Функция также может содержать класс сущностей с различным уровнем вложенности.Если есть другой способ без использования рефлексии, это было бы здорово, потому что рефлексия не очень хорошо работает для фреймворка Entity и птенцов....

Ваша помощь очень желательна.

С уважением,

Ависек Саркар

Что я уже пробовал:

Наша функция записывается в класс как :-

public class GetAllProperties
    {

        private static Dictionary<string, object> result = new Dictionary<string, object>();
        private static bool IsSimpleType(Type type)
        {
            return
                type.IsValueType ||
                type.IsPrimitive ||
                new Type[]
                {
                        typeof(String),
                        typeof(Decimal),
                        typeof(DateTime),
                        typeof(DateTimeOffset),
                        typeof(TimeSpan),
                        typeof(Guid)

                }.Contains(type) ||
                        Convert.GetTypeCode(type) != TypeCode.Object;
        }
        public static Dictionary<string, object> GetProperties(object obj)
        {
            string ObjName = obj.GetType().Name;

            var PropertyList = GetProperties(obj, ObjName);
            return PropertyList;
        }

        private static Dictionary<string, object> GetProperties(object obj, string objName)
        {
            if (obj == null)
                return result;

            string ObjTypeName = objName;
            

            Type objType = obj.GetType();
            PropertyInfo[] properties = objType.GetProperties();

            foreach (PropertyInfo property in properties)
            {
                object propValue = property.GetValue(obj, null);


                if (IsSimpleType(property.PropertyType))
                {
                    if (!CheckDuplicateKeyInDictionary(ObjTypeName + "." + property.Name))
                    {
                        result.Add(ObjTypeName + "." + property.Name, value: propValue);

                    }

                }
                else if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType)) // if object type is of Enumeration type.

                {
                    try
                    {
                        if (property.PropertyType == typeof(string[]))
                        {
                            if (!CheckDuplicateKeyInDictionary(ObjTypeName + "." + property.Name))
                            {
                                result.Add(ObjTypeName + "." + property.Name, value: Convert.ToString(propValue));
                            }
                        }
                        else
                        {

                            IEnumerable enumerable = (IEnumerable)propValue;

                            if (enumerable != null)
                            {
                                object enumTypeValue = enumerable.GetEnumerator().GetType();

                                if (!CheckDuplicateKeyInDictionary(ObjTypeName + "." + property.Name))
                                {
                                    result.Add(ObjTypeName + "." + property.Name, value: enumTypeValue);

                                }

                                foreach (object child in enumerable)
                                {
                                    ObjTypeName = ObjTypeName + "." + property.Name + "." + child.GetType().Name;

                                    GetProperties(child, ObjTypeName);
                                }
                            }
                            else
                            {
                                if (!CheckDuplicateKeyInDictionary(ObjTypeName + "." + property.Name))
                                {
                                    result.Add(ObjTypeName + "." + property.Name, value: null);
                                }

                                //TODO Get the type of the enum and iterate over to collect class propertes.
                            }


                        }
                    }
                    catch (Exception)
                    {
                        throw;
                    }

                }
                else
                {
                    if (propValue == null) // if object type is not intialized.
                    {
                        GetProperties(property.PropertyType, ObjTypeName + "." + property.Name);
                    }
                    else
                    {
                        ObjTypeName = ObjTypeName + "." + propValue.GetType().Name;

                        Object objTypeValue = (Object)propValue;

                        object ObjValue = objTypeValue.GetType();

                        if (ObjValue != null)
                        {
                            if (!CheckDuplicateKeyInDictionary(ObjTypeName + "." + property.Name))
                            {
                                result.Add(ObjTypeName + "." + property.Name, value: ObjValue);

                            }

                            GetProperties(propValue, ObjTypeName + "." + property.Name);
                        }

                    }

                }
            }

            return result;
        }

        private static Dictionary<string, object> GetProperties(Type objType, string objName)
        {
            string ObjTypeName = objName;
            PropertyInfo[] properties = objType.GetProperties();

            foreach (PropertyInfo property in properties)
            {
                object propValue = null;



                if (IsSimpleType(property.PropertyType))
                {
                    result.Add(ObjTypeName + "." + property.Name, value: propValue);
                }
                else if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType))
                {

                    var enumtype = typeof(IEnumerable).IsAssignableFrom(property.PropertyType).GetType();

                    if (property.PropertyType == typeof(string[]))
                    {
                        result.Add(ObjTypeName + "." + property.Name, value: propValue);

                    }
                    else
                    {
                        result.Add(ObjTypeName + "." + property.Name, value: null);

                        GetProperties(property.PropertyType, objName + "." + property.Name);// Need to check
                    }
                }
                else
                {
                    GetProperties(property.PropertyType, ObjTypeName + "." + property.Name);

                }
            }

            return result;

        }

        private static bool CheckDuplicateKeyInDictionary(string keyName)
        {
            if (result.ContainsKey(keyName))
            {
                return true;
            }
            else
                return false;
        }
        
    }

OriginalGriff

И что же?
В чем вам нужна помощь?
Я не вижу никаких признаков метода в этом коде - вы забыли включить его?

Member 8025807

Метод записывается внутри класса. Метод должен возвращать все виды свойств объекта класса, которые он принимает в качестве аргумента. В сложном сценарии это означает, что когда свойства являются типом другого класса, он не работает идеально.

Member 8025807

Метод записывается внутри класса. Метод должен возвращать все виды свойств объекта класса, которые он принимает в качестве аргумента. В сложном сценарии это означает, что когда свойства являются типом другого класса, он не работает идеально.

Gerry Schmitz

Но дело в том ,что может существовать вложенный уровень свойств различных типов,таких как int,string, collection, property as collection, property as class type.

И что же?

потому что рефлексия не очень хорошо работает для структуры сущности и птенцов...

Кто сказал? "Сущности" - это просто "классы".

Да и какой в этом смысл? Сериализуйте в XML, если вам нужна "картинка".

0 Ответов