public static List <ExifContainerItem> GetExifContainer(bool includeEnumValueTranslation)
        {
            List <ExifContainerItem> container = new List <ExifContainerItem>();

            Type t = typeof(ExifMetadata);

            PropertyInfo[] pi = t.GetProperties();

            for (int i = 0; i < pi.Length; i++)
            {
                ExifContainerItem containerItem = new ExifContainerItem();

                object[] attr = pi[i].GetCustomAttributes(true);

                for (int j = 0; j < attr.Length; j++)
                {
                    if (attr[j] is ExifDisplayAttribute)
                    {
                        ExifDisplayAttribute exifAttri = (ExifDisplayAttribute)attr[j];

                        string displayName = Resources.LanguageContent.ResourceManager.GetString(exifAttri.DisplayName,
                                                                                                 Thread.CurrentThread.CurrentCulture);
                        containerItem.DisplayLabel = displayName;
                        containerItem.ValueFormat  = Resources.LanguageContent.ResourceManager.GetString(exifAttri.ValueFormat,
                                                                                                         Thread.CurrentThread.CurrentCulture);
                        containerItem.Property = pi[i];
                        containerItem.ExifTag  = pi[i].Name;

                        if (includeEnumValueTranslation)
                        {
                            if (pi[i].PropertyType.IsEnum)
                            {
                                containerItem.EnumValueTranslation = new Dictionary <string, string>();

                                Array enumValues = Enum.GetValues(pi[i].PropertyType);

                                for (int k = 0; k < enumValues.Length; k++)
                                {
                                    // TODO think about how to handle same enum value in different enum with different display.
                                    if (!containerItem.EnumValueTranslation.ContainsKey(enumValues.GetValue(k).ToString()))
                                    {
                                        containerItem.EnumValueTranslation.Add(enumValues.GetValue(k).ToString(),
                                                                               GetEnumItemDisplayValue(enumValues.GetValue(k)));
                                    }
                                }
                            }
                        }

                        container.Add(containerItem);
                    }
                }
            }

            return(container);
        }
        private Dictionary <string, string> getExifTagDisplayNames()
        {
            Dictionary <string, string> tags = new Dictionary <string, string>();

            PropertyInfo[] pi = typeof(ExifMetadata).GetProperties();
            for (int i = 0; i < pi.Length; i++)
            {
                object[] attr = pi[i].GetCustomAttributes(true);

                for (int j = 0; j < attr.Length; j++)
                {
                    if (attr[j] is ExifDisplayAttribute)
                    {
                        ExifDisplayAttribute exifAttri = (ExifDisplayAttribute)attr[j];

                        string displayName  = exifAttri.DisplayName;
                        string propertyName = pi[i].Name;
                        tags.Add(propertyName, displayName);
                    }
                }
            }

            return(tags);
        }